BLENDER_v223REND P1SRd|ISRscreen,\ yD =DATA,JܞDATAܞJ,=DATAJ<ܞ =DATA<J DATAJ<DATAJL DATALJ(DATAJL (DATAJ\DATA\J(DATA KܞDATAKl <,DATAlK,DATAK̚l<DATA̚K|DATA|K,̚LܞDATA,K|DATAK|,LDATA|K,DATA,K|DATAK,\LDATAK<\DATA<K\DATAK<DATAKLDATAL<,<dp{D;BJDDLDATABLDdCIzաD????????| m===o?p=A|A??p=A B? #<C|tggDATA@Dl/9DATAL,\??Pףdp{D;BpOI{D{DDATAA<zC̽̌?zC@ #< #<`jFzD OBzC̽̌?DATA<>??? ???? A???PA A!O?j?}GCHB? A B? #<C|t@h@hDATA@D</9SRdIL\|SRscreen.001L\||`yD =DATALJDATAJ|L=DATA|J, =DATA,J| DATAJ,DATAJ< DATA<J$DATAJ< $DATAJLDATALJ$DATAJLDATAJ DATA\K |DATA K\,LDATAKl LDATAlK,DATAKlDATAK|<DATA|K,|DATA,K|<DATAK,<DATAK<DATA<KDATAK<L<DATAKLLDATALK̏LDATȀK|LDATA|K,̏LDATA,K܎|DATA܎K,DATAK܎DATA|L,L,##     !Cdp{D;BJDD< <DATAB<DdCD#?8bCC(BDC?z?yeOBDATA@<D/9DATA,L|<|= =:: '= '; <=!d;BDD|\2DATAL,7744?(k@AHM    >ydgD;BCgDgD\,LmLmDATA\>w>6K&P?o?B 4>kFҌ 3^?G>R{j"D?t>o?M9KE 4>^?&P?mFD>M}$AD@A? >% |P&P?dV? >kF>ԉ3谄@enGT"s>AA"DAGF>Z?{5c3?Ž 3=0);>ehM+%>8ןJBz*A6B)@(6?.ԾFDSA B?=CxЄ=|tDU DATA@D\OAD FILE/9DATAA,zC AzC A #< #<`jFzD OBDATA,BDdCDv@CC(BDC?z?DATAL|`<L11MM'.==w7=o? !  !  fd;BPEFRF,\r\rDATAXG̀ \T .0?DATÀ>\b????=0t??Yf2?|1X:0??@1t@?'.==w7=o+ƽ^:o ;?(Au2%Ap[7 '5?@/t@??(A B?=C?=0t|t DATA\bAàzC AzC A #< #<`jFzD OBDATAaB,\bDdCDv@CC(BDC?z?DATA@,DaSAVE FILEFILEd:\pete\phys1905f02\nov26\\tics\rotator-works.blendlendddmDATA|`LLJJGG9=9=o? !  ! ydgD;BCgDgD +\DATA +>^??Za>71@??oⲲ?x 0`BZa@71@?9=o;9=R#<#oM?hA `3;ZhAX 5C ە5Za@71@?5?5hA B?=CZa>71|t DATA@^D] +OAD FILE/9DATA]A\^zC AzC A #< #<`jFzD OBDATA\B]DdCDv@CC(BDC?z?SRdL\ISRscreen.002, ,YXS|RAyD =DATA, JLDATALJ[, =DATA[J[L =DATA[J\[[ DATA\[J [[DATA [JZ\[ DATAZJlZ [(DATAlZJZZ (DATAZJYlZpDATAYJ|YZ pDATA|YJ,YYpDATA,YJ|Y(DATAXKXL[DATAXKo?uub dp{D;B0CKpD KGDATA KCLIzCAzCAbb A@FB= A DATALI>G K????????8=i>o?fffAD&@??fffA B? #<C|tDATA@GDLIAVE TARGA/t1.blend9DATAFLAK|Y,YlZY8=H>o?{{R dp{D;B0CKpD FBDATA FCLDzCAzCA1||1 A@FB= A DATALD>B F????????8=H>o?fffA*@??fffA B? #<C|t>>DATA@BDLDAVE TARGA/t1.blend9DATAALFZZ,Y|Y8=>o?{{Rdp{D;BpOI{D{D@|DATA@A\~B̽̌?B̽̌?RR #< #<`jFzD SQB̽̌?DATA\~>|@????????8=>o?fffA@??fffA B? #<C|tzzDATA@|D\~OAD FILE/9SCy<SC1|t@w|x(,$@jUA@dd??< d??_@??////render/fixed-04-500.avi//#w\wDATA@9<@fDATA<@9x@liDATAx9|x<@o?29KA 4>^?&P?mFF>M}$AD@A??????k.*3?3qy2?0潴?dC?)d??>)d????ssDATA,tliDATA`stConst?OBp6=;M@0@@?3=5Ne4=?O8G<:#~HپʗC@?|v?7L>5=|?,r+}>=?@???DATAlpOBX> Cw?nM@m@A?????w?dw>/?ܬ7?^>/1?@50@ A?DdC? #=?>=?@???LlLlDATA,lliDATA`LllConst?OBli6fQ_>A}?˼7K>|_z@@@?????Z_Xy?z=>=z||wDTC'?DdC? #=?>=?@???DATA,pOBf6lcliOBPlaneLfH=+@&@-?-?-????-?3-?-ο3H=+@&@?????)c>23o[ ?߽f9?f>E> C@q5@>?DdC? #=?>=?@???DATALfOBlc6fOBCylinderliL,că-@jUA@@@@??????xR=tV[ R> O6z~H<;Kݽ@U>@?_?R;F<? Mѻ?;?{_c4>?Hz=wz=3|̽*vXn>J\B?ބ8@?DdC? #=?>=?@???DATA,cME }M-Gp(L,~jT+@ MG&.??|?ʲ J~>(?hHm ?)LkG JJ+@{?6ӸHDATAH`*F%J)ME,2g;6B>=?DATADATA(X/B7'>y= j5>r=DѢԂ?>3'=eJE>z<֪bG>7E>z%Ԃ?>3'a!~j5>r M17'>yG?G>'K^e>ɽlTf=`CֽZK0=uڽz]*=`Cֽgvt-C=ɽ%G<a2UeAH<Ф=Jw-C==܄SE=`C=EZ0=v=/f]}=PC=ߥje>=G>=Az.>=Ș>=]>8܇=ȘH0]>.D=ȘP Y^ط> p<ȘT^?>;ȘV^ط> aȘTX^>8 Ș>P"^>UȘH{](>Ș>\t>8'Ș@2[>.>XWȘe#|NZj>ǽȘXG>x˽ȘW=@o>ǽȘ!!Z@YZ>XWȘ!SrZ'G>H'Ș.1J[R7>8Ș8>>r\.)>UȘH1/]>09 ȘrP!]m>@ aȘ*U^T>;ȘV^m>o<ȘCU]>p.D=ȘPAނ])>܇=ȘH\R7>=Șv>\G>"=Șf1ٴ[^Z>8R=Ș'"Y@o>=Ș7ZXG>x=Ș/mWN>=ȘYY#.>R=Ș'#SZ\>"=Ș1I\0=G>;ȘDATAd*`@A! @A"!@A#"@A$#@A%$@A&%@A'&@A('@ A)(@ A*)@ A+*@ A,+@ A-,@ A.-@A/.@A0/@A10@A21@A32@A43@A54@A65@A76@A87@A98@A:9@A;:@A<;@A=<@A>=@A?>@A ? !F!"F"#F#$F$%F%&F&'F'(F() & )* & *+ & +, & ,- * -.)./)/0)01I12I23I34I45I56I67I78I89)9:):;);<)<=%=>&>?& ?)ME2L,MEPlane,'< kIU@ @W@DATA DATA/ ~ @έ@.e~ @.i.e~ ,i.ez ҭ@.ea@??'@g@ '@@N"@N/@fN/@fN#DATA$<*@  MEL2MECylinder& n\iB`нW ?PP>N>-?DATA DATA(\i/Bi狄??HLG狄J1Ӥ0 狄RW"ФԽꮽ狄=%2@-VtW="@"A?>"@A ?" !F!"F"#F#$F$%F%&F&'F'(F() & )* & *+ * +, ) ,- ) -.)./)/0)01I12I23I34I45I56I67I78I89)9:):;%;<&<=&=>&>?& ?)MA!MAarrowL????????>?L??2 ????MA!LMAarrow2?????????L??2 ????MAL! MAblockL?cR>???????}>?L??2 ????MA !LMAfloorL?;>_>????????L?RY>2 ????DATAP???>><?????TETEfloor>@????????CAl CACamera=B?A B?LALALamp???@A4B>??? B4B?@@WO7WOWorld@7f?%Dq??=}4?b%???Ap?pATXd\TXrotator L,p,p$PuDATA ,HDATAl   HDATAl̯̒qDATA̯|l|b ):DATA|,̯,3x3 DATA,ܮ|ܑ0,0,DATAܮ,l9]*b[DATA<ܮ9]*b[DATA<9]*b[DATA<LQDATAL9]*b[DATAL<9]*b[DATAL̎9]*b[DATA\ c[0DATA\ 9]*b[DATA \9]*b[DATAl <9]*b[DATAl c[0DATA̪l DATA̪|||0DATA|,̪, v,mDATA,ܩ|̋+def DATAܩ,| resDATA<ܩ 4][0DATA<4][2]DATA<,4qDATAL DATAL v,mDATAL\ v,mDATA\&SDATA\ x 32DATA \<4]*v DATAl ̇4v[2]DATAl\4v[2]DATḀl DATḀ|܆QDATA|,̥):nDATA,ܤ|<of tDATAܤ,ADD DATA<ܤ[2] DATA<\[2] DATA< [2] DATAL̄ [2] DATALmB[DATAL<m ):DATA\of mDATA\ !]enDATA \<FREEDATAl IDATAlDATA̠l\DATA̠|  reaDATA|,̠@DATA,|lDATA|,,DATA|,܀ reaDATA,|8~DATA,<2][2DATA< QDATA<|DATA<\ DATAL ude DATALQDATALl'2]*aDATA\t(x)DATA\ DATA \):DATAl ,"reenDATAlresDATAlDATA|LeenDATA|, DATA,|DATA,| \DATA<<DATA<def DATA<oducDATALlDATAL "<DATAL retDATA\LDATA\ <0][0DATA \"' )DATAl QDATAl< DATAl DATA| DATA|,| DATA,|<QDATA,(DATA<):nDATA<<DATA< DATALDATAL| ):nDATAL<DATA\$DATA\  massDATA \LH@DATAl xDATAl DATA\@ll#I =DATA\@<L DATA<p\@00.0,DATApp<,q[1],DATAp,ppIB[2DATA,pprd inDATA,p|DATA< FREEDATA<reenDATA<FREEDATALLDATAL@eenDATAL\DATA\|eenDATA\ LDATA \ QreenDATAl ,P@DATAl@DATA̺l<eenDATA̺|lDATA|,̺,`eenDATA,ܹ|ODATAܹ,,eenDATA<ܹ*QDATA<T!!"DATA<,DATAL\`w' )DATAL.ug.tDATAL|elseDATA\.a' )DATA\ DATA \ernDATAl ,.DATAl me )DATA̵l  varDATA̵|, 0,3DATA|,̵ DATA,ܴ| matrDATAܴ,< 'LDATA<ܴ Rz =DATA< -[ 0,DATA<< ,enDATAL  DATAL Rz =DATAL|  DATA\ -(RDATA\  ,qDATA \| ADATAl  ,DATAl ̱DATA̰l|-DATA̰|<DATA|,̰ Ry DATA,|DATA|,\DATA|, ADD DATA,|DATA,|DATA<<QDATA<-CoutDATA<|.(t) DATAL,ordsDATALe(R)DATAL scrDATA\<"cDATA\ eenDATA \ IB DATAl <I, oDATAlQDATAlof eDATA|\DATA|,DATA,|] + DATA,|] + DATA<,] + DATA<lDATA<DATALLreenDATAL$inv,DATAL\ DATA\x 32DATA\ DATA \|,0.0DATAl , + dDATAl + dDATAl + dDATA|L,DATA|,eenDATA,|'0]nDATA,<'1]nDATA<'QDATA<DATA<LH.DATALDATAL * dtDATALLotZ DATA\ eenDATA\ 005 DATA \L0mB )DATAl '`DATAll@ime,DATAl,"fraDATA| DATA|,FREEDATA,̟|L-%E )DATA̟|,,reenDATA|,̟%(roDATA,ܞ|<2reenDATAܞ,DATA<ܞ.reenDATA<<(rodDATA</ %e"DATALe"%DATAL0hDATAL logDATA\l/%(roDATA\ GDATA \DATAl l:ADATAlFREEDATA̚lDATA̚||zzDATA|,̚ :HDATA,ܙ|le.wDATAܙ,lDATA<ܙ/kkDATA<\/>, IiDATA<.& logDATAL.$DATAL<.%܈DATAL-e.wDATA\l-@\n %DATA\  -&qDATA \,$))DATAl L,%DATAl+reenDATA̕l,DATA̕|+QDATA|,̕L+&senDATA,ܔ|*&senDATAܔ,*&senDATA<ܔL* pi ):DATA b = a - 2.0*pieenDATA | return b DATA<DATAdef dot (a,b):EDATA # return dot product5DATAl x= 0.0DATA$  x = a[0]*b[0]+a[1]*b[1]+a[2]*b[2]nDATA  return xEEDATAeenDATA<# now start real programREEDATA$rod = Blender.Object.Get ( 'Rod' )DATA 1 DATA$<time = Blender.Get ( 'curtime' )eenDATApi = 3.14159DATA dt = 0.04DATA |mass = 1.3DATA<eenDATA,# turn this on to see lots of debug dataDATAstartDebug = 1000enDATA<if ( time < startDebug ):EDATA  debug = 0EDATAelse:5DATA | debug = 1 DATA< 32DATA(# setup mom of inertia in rest frame15DATA IB =[ DATAL[1.66*mass, 0, 0 ],DATA[0, 0.4166*mass, 0],5DATA[0, 0, 1.4166*mass ] ]DATAl] ]DATA LIinvB = [EEDATA0[ 1.0/IB[0][0], 0.0, 0.0 ],DATA,q[ 0.0, 1.0/IB[1][1], 0.0 ],DATA[ 0.0, 0.0, 1.0/IB[2][2] ]]DATArDATA# start conditions at t=0EEDATA if (time == 1 ):eenDATA rod.RotX = 0.1DATA rod.RotY = 0.0DATAL rod.RotZ = 0.0DATA@eenDATA\ rod.dRotX = 0.0eenDATA| rod.dRotY = 2.0 * dt5DATAL rod.dRotZ = 0.1 * dt5DATA QxDATA,P rod.LocX = 0.0DATA rod.LocY = 6.0DATA< rod.LocZ = 3.0DATAlDATA,` rod.dLocX = 0.0eenDATAO rod.dLocY = 0.0eenDATA, rod.dLocZ = 0.0eenDATA*eenDATA print "\nRESTART!!"15DATA,DATA\`if ( time == startDebug ):EDATA0 if(debug):logfile = open ( 'debug.txt', 'w' )%DATA|else:DATA0 if(debug):logfile = open ( 'debug.txt', 'a' )DATADATA# log frame numbernDATA0,if(debug):logfile.write("\n frame %d "% time )EDATA DATA #get omega in real spaceREEDATA4, om =[ rod.dRotX/dt, rod.dRotY/dt, rod.dRotZ/dt ]DATA f (DATA # find rotation matrixDATA(< apos = [ rod.RotX, rod.RotY, rod.RotZ ]DATA Rz = [DATA0 [ math.cos(apos[2]), -math.sin(apos[2]), 0 ],DATA0< [ math.sin(apos[2]), math.cos(apos[2]), 0 ],DATA [ 0,0,1 ]]DATA Rx = [DATA| [ 1, 0, 0 ],DATA0 [ 0, math.cos(apos[0]), -math.sin(apos[0]) ],DATA0 [ 0, math.sin(apos[0]), math.cos(apos[0]) ]]DATA| Ry = [DATA0 [ math.cos(apos[1]), 0, math.sin(apos[1]) ],DATA [ 0,1,0 ],EDATA0|[ -math.sin(apos[1]), 0, math.cos(apos[1]) ]]DATA<DATARxy = matMult( Rx, Ry )DATAR = matMult ( Rxy, Rz )DATA\eenDATA# add torque DATAF = [ 0.0, 0.0, 0.0 ]5DATA|torque= [ 0.0, 0.0, 0.0 ]DATA<eenDATA0#try again- use formula 4.18 in Coutinho bookDATA0|# alpha(t) = Iinv(t) ( H(t) x om(t) + torque )DATA,# all in real coords15DATA`DATA# find ang mom = I(t) om(t)DATA$<# first convert IB to earth coordsnDATAI1 = matMult ( IB, R)DATA$I = matMult ( transpose(R), I1 )eenDATA<H = matVecMult( I, om )DATAeenDATA # get left side of eqn abboveDATA\temp = cross ( H, om )0DATA# add in torqueDATA temp[0] = temp[0] + torque[0]DATA |temp[1] = temp[1] + torque[1]DATA ,temp[2] = temp[2] + torque[2]DATA`DATA # divide by I in earth coords %DATA LIinv1 = matMult ( IinvB, R )tDATA(Iinv = matMult ( transpose(R),Iinv1)REEDATA$\domdt = matVecMult( Iinv, temp )eenDATAeenDATA # find om at end of next stepDATA|omNew = [0.0, 0.0, 0.0]DATA ,omNew[0] = om[0] + domdt[0]*dtDATA omNew[1] = om[1] + domdt[1]*dtDATA omNew[2] = om[2] + domdt[2]*dtDATALmNeDATA # update dRot with avg ang velDATA(rod.dRotX = (om[0] + omNew[0])/2.0 * dtDATA(<rod.dRotY = (om[1] + omNew[1])/2.0 * dtDATA(rod.dRotZ = (om[2] + omNew[2])/2.0 * dtDATAenDATAL#update angular posDATA rod.RotX = rod.RotX + rod.dRotXDATA$rod.RotY = rod.RotY + rod.dRotY DATA Lrod.RotZ = rod.RotZ + rod.dRotZDATA eenDATA # try finding an energy thingEEDATA4LdRotMag = mag ( [rod.dRotX,rod.dRotY,rod.dRotZ]) )DATA(E = dot( omNew, matVecMult( I, omNew) )DATADlprint "frame %d dRotmag= %e E= %e H=%e"%(time,dRotMag,E, mag(H))eenDATA, DATAif ( debug ):DATADATA0L logfile.write("\n energy after step %f "%E )EDATA0 logfile.write("\n om= %e %e %e"%(om[0],DATA om[1],om[2]))DATA4< logfile.write("\n H= %e %e %e mag=%e"%(H[0],nDATA H[1],H[2], mag(H)))5DATA0 logfile.write("\n temp= %e %e %e"%(temp[0],DATA< temp[1],temp[2]))DATA0 logfile.write("\n domdt= %e %e %e"%(domdt[0],DATA domdt[1],domdt[2]))DATA4 logfile.write("\n dRot= %e %e %e"%(rod.dRotX,enDATA rod.dRotY,rod.dRotZ))DATA0l logfile.write("\n rot= %e %e %e"%(rod.RotX,DATA rod.RotY,rod.RotZ))DATADATA<l logfile.write("\n R=\n %e %e %e \n %e %e %e \n %e %e %e"%DATA  (R[0][0],R[0][1],R[0][2], DATA R[1][0],R[1][1],R[1][2],DATA| R[2][0],R[2][1],R[2][2]))DATA<  logfile.write("\n I=\n %e %e %e \n %e %e %e \n %e %e %e"%DATA  (I[0][0],I[0][1],I[0][2], DATAl I[1][0],I[1][1],I[1][2],DATA/ I[2][0],I[2][1],I[2][2]))DATA@\/ #logfile.write("\n Iinv=\n %e %e %e \n %e %e %e \n %e %e %e"%DATA(. #(Iinv[0][0],Iinv[0][1],Iinv[0][2], DATA(. #Iinv[1][0],Iinv[1][1],Iinv[1][2],2 "?@ABCDEFGH%I#$J%K%LMNOPQRSTUVW!X&YZ[\'](^_`abcdefghijklmn) opqrs tuvwx yz*ghi{+|*}, ']#~#ABMN(#/m%#~)+,-fghijAB&%I.%/:fghiYZ&%/I01!X222/34 %/ed5 6777 6 5 8&4  ' '%9/ de/4 0!:::6 5 "#$%&'(  )#;*+,-./<*+,-./= 01234>56?@>789A:;B{ghiC<D4 = %/ > ? @AA@BBCCDDEEF G&HedIJKLF MNOP6Q%GR'SHHHT 'NUVWXY'Z'[%94I\J]  = ^ _/K`abdcdefghijklmnopqrstuvwxyz{|}~I     GGG2 L+f%&IMNNN']O3w=PQ'LQ#~ NRS M GPOgIT #~(^=U*UU   E  c'TUV  !"#$%&'()WWWXXX*V+ , -%&./01239YYY45V+62/7 89:;<=>?@oZZZV+6[[[\ABCDEFGHI]JK|LM NO^ ^^V+ P/Q 8___V+#R/ST3```U VWX22YZ[\] ^ _ `aabcdefghijklm|b n o pQqrstuvwxyz{|cccc} ~dddcce&eeccccb#        f g%KgggMh hh/gi  opsz tvw x yj jjj /hg%Qq$Jijjj k   lllmmm/nnn'oppprtq 'UVWXr rr/sU %'ZVWXqQt tt uNuuC      !"#$%&'()*+v,v-./0123456789w:w;<=%> Nx xxT?@A B CyTDEz{T/F|GHIJK}TLM~TNOTPQRTSTQTUV'WXY?Z[\T ]'^_` Vab\?cT ]defgh' IiTjklm9no pqrst h'DuTvwQq'TL' xyadz{|} T~'RR T~RT'XY a?T 'S x' G   'DDdghiK- xghi /''& DDDG '!X %2 V+qp3TUVWX'Z'[%abdcdefghjklmvw' R  ????Z T6adcefg    degT9J % T9I  3V+I\/9  %?Th''9n'9'9'   ENDB