From 42edf57945938aaa5c9e5001d597ae0d876d1fac Mon Sep 17 00:00:00 2001 From: git archive service user Date: Sun, 29 Dec 2019 19:04:03 +0100 Subject: [PATCH] Initial commit by marcello Galli --- LICENSE | 1 + README.md | 42 + code/a93_poster.pdf | Bin 0 -> 50830 bytes code/a93sait.pdf | Bin 0 -> 121135 bytes code/cbs.exe | Bin 0 -> 89088 bytes code/cbs.for | 6256 +++++++++++++++++++++++++++++++++++++++++++ code/f.tex | 203 ++ code/missfont.log | 8 + code/test1.com | 44 + code/test2.com | 71 + code/test3.com | 51 + code/test4.com | 58 + code/test5.com | 94 + code/test6.com | 99 + code/test7.com | 107 + code/test9.com | 149 ++ code/test9.log | 556 ++++ code/vt3.com | 114 + code/vt3.log | 759 ++++++ codemeta.json | 36 + 20 files changed, 8648 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 code/a93_poster.pdf create mode 100644 code/a93sait.pdf create mode 100755 code/cbs.exe create mode 100755 code/cbs.for create mode 100755 code/f.tex create mode 100644 code/missfont.log create mode 100755 code/test1.com create mode 100755 code/test2.com create mode 100755 code/test3.com create mode 100755 code/test4.com create mode 100755 code/test5.com create mode 100755 code/test6.com create mode 100755 code/test7.com create mode 100755 code/test9.com create mode 100755 code/test9.log create mode 100755 code/vt3.com create mode 100755 code/vt3.log create mode 100644 codemeta.json diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f9c9132 --- /dev/null +++ b/LICENSE @@ -0,0 +1 @@ +This software is in the public domain. diff --git a/README.md b/README.md new file mode 100644 index 0000000..653f12b --- /dev/null +++ b/README.md @@ -0,0 +1,42 @@ +cbs +=== + +Close Binary System Light Curve Analysis Program +--------------------------------------------------- + +This is a VAX FORTRAN code, written between 1991 and 1993, +for close binary system light curve simulation. +It consider many effects; the Roche lobe shapes +where carefully drawn and a tiny accretion disk is accounted for. + +The program was written between 1991 and 1993, +by Marcello Galli, it consists of about six thousand lines, +and run on a VAX/VMS mini computer. + +It was presented at the poster section of the +1993 Italian Astronet Meeting in Trieste, +(see Mem. Sait. vol XX,1993), but hadn't +many users. + +The program needed 40 or 60 MBytes of RAM; +it was a big number for that days, more than +available on many VMS workstations. +The trick was to alter the the page file quota +for a single process, sometimes causing +a computer crash. + + +In the code folder we have: + +- cbs.for : the source code +- cbs.exe : executable for VAX/VMS +- some input for tests (.com files) +- test9.log,vt3.log: examples of an interactive sessions. + +- a93sait.pdf : the paper on "Memorie della SAIT" +- a93_poster.pdf : the text for the poster (without figures) + + +It is here as an example of VAX FORTRAN usage, +to be included in the collection of the +[*Software Heritage*] project (https://www.softwareheritage.org/). diff --git a/code/a93_poster.pdf b/code/a93_poster.pdf new file mode 100644 index 0000000000000000000000000000000000000000..99f0ee8fe4fb24f9a015eae9aefd340f63624add GIT binary patch literal 50830 zcma%>L$GK~x^1^@+dkX2ZQHhO+qUhqZQHhOoA0lRckgXfr&?=8HnNp5bBviEsl2c# z4FfG36zS+yTp<(-0X>18p(PYIH=VSJt(mhq0qZ|2igcnD*3Kr51azX-2F@nJCPsF~ zCcL~*PR@=d1~yRc*)^(CcEoHjJ)diO^kT5_^O7Xbdk${cC^R3^+jyE!dt^JzeVprJ zto$FBQamHX!^lk{(D+jnDDU@&ViULEMc4WZWxjfNtaP*k_TLUhp_kL2G1I>|7punx z?#-xS>}&b`oNU&+))OLJ>X*#%*xZe*;)5^s?<(DR9~8PJ@XTqL zo*Z~l^1^$7zgX8n_GGTU`Ao|Ys5zSH+-kzw`!EofWSm}E*AsBWn_(N!?u;S@H%8;j zIXwBuvT~x#JBwevAc;w^o!bY5Q(n=0H+`E8%5;pmq!)-s^uw-Gm=7)!rvjjHTVeEAq0Tr(c~Pw~*q!h2MNzU5&c(&TE3yPzvjx*B$I!8%G()Xwgwakliyqes zY}mz1dfE^SG_x=oBqD)`8cq#}{)}%-;1Xh}atc8y{z1=GkOcp;jVf;FWa)W8On|MI zK{{B#iV~#V!omWh(1?DaXo>WW(FANU1o5}HrJaNxq8==bWe5Rz>t(^V-*J<_3&}77 zdHf>FA(0gj*ag%l0U9=-zgZyIsQt9&+UhgQvkRT{b-7Q1h1q=?&}au38Nu9;FT8+< zh#5!y9M8V{7@Tr2sB9phIvTRsIn63J56Km6#)hyD6tkio@GNlb+#onV0*0hJg0l-T zfJ_96E>|!;geWj-d-(H;wh^?N7dwYxU@2H!lhb>dTnI(^YC?I^kZHy&2f>hlcA-Wg z>+o{8dN0A)-EHz-1M1p@zVL%qP6UgFjrc{-EzGxsf7IdtC!%t_xxmUL6t*Qj(~1rE zLc2)1C)%=*Tk@3?$EJ&HY}+$t`koL{#vR1zN=y3BegjA}fz{;=B&lrDRa_oA$@Or% z)I}OY%^d}$)qaB;ypdw6H7jhu5zPeEhfg-a1exL}>%2h7A4SiV6d5;8k;(kHy>T_)pKOIH?4^!qWQ5}M`l z66OG{Go7kJSQm>tIiyJjYtoZhP+?w1nIb2k&UyUR#bYo&j>pZ=m#q&2b9A$$xm}CX z@=4e9=NuA`1|Vict1@0E)C=JzZwIey=NvD~4b6s|Njdw5iI;FQ?(wi3$ju}Hm zsX*72J?-IL-N{+${aV_-!^q4Zu2HU9>uNr{@iDrk_T(!?b3qOF+31b+L^2h|=@RMp z($;)nzGY|8^c4x(JC`wrVoKk`@gC7 z1bMvxNmqjtCbq`^KYjlB`&VN9E2sYTWnf^Yhx-3(j12z~XN-*hO`bJtO1WvX!0dqg z4pG~&53N0X)&s#ov)2QFsRKlDXQE^}OC~M6>=LiP5`J#5Dao?yJe|afCDzC-kbC^> zNEEmx{>1$1?c{jB6zy(r<&AAmkMELG`LtpGc6M$0w2y)slyw1^T-*BjB=(lO?nOiB zyU~ggHm_gb%KBpWu=6Adib3p!L3_f9ex8MSdA{(fmxYC`K7}!Hp0Q`=6;g_VnuJMt z!uCrdhlVZkz3dj69=BaEmE=G$+{`qg^>5a1>J=>1$%ig!1~m?*jRV*%-z}bJut>h0 zh4P)3#3-~IN3akyDVB59%(WeuG{6@tIJl<@v)6^SdIY#QxDTU|eAYbbAKLS8=i8IJ zwn@a%da~8j_m?*f-aqTC*xX&aC=zwA228r=sIhx@>0_0_g6L&>?x?==N+l@7fXDqL zoHrvW2DmI*MdBL4BM-OH_uX9?3`H2@p3nZwt0Ty`wJ)9A+HyXvg#3;oLijv16 z=gXIqfY-zn{Ch-L^*UpZPe*SNR2CF4VsUuzS*>9x?9Bbbh-=S3<^VaHRrwCpgUIb% zQzTE{$=rP+Ws62_nifhOR}DP0ND3@IXh%sVI;vvdF*~8K2jW|1FytFJM=^i_03;h2 z)sOIdWBfaAhf)YAiu_8;4p;F?0x~F72?URu-lXG_mdn3^NIzki z__#Hk_PB8zG5qFk{T7Dbjb(H85gl}C$_<>nI*V@+gp(VE2wPSbHXWZXVAw>il+5C$WifXN46P~)HT$jWYPuZNbD zBBs34u)NjLsdOh8W)2ZVwx@c~r2*EdBIuhyL{wO}p;2^ur?F+6vq8aZuDyg|`Acn4 zG-YHS;YF&STl%wC^9}U)MI_x`!_Uv~O|vx_XI{#=Dnc4hx*h!HWQv zM=VaNh;0?QOaV&t0Hf6i384T|;zb%xo(x#wF@di7OfjaStABt)7O`btxVWbvF|F{9Zq1L3`?~#Xu2k(YzpRLh9MWH-Am+L3f4raYXLzWTM&GMwFNmX7<;6Y1IAV_R>73XC3=_|2Y-_q&_DedCYKoTAA$xt= zNXo)FdzYNzYeD0em}e3|zaLHSEfk}EgjF4Vj=dTRJgODdh$OTuCV%?zYei0SdWr~5 z#2HB{&Qv&A^BB)&_T%ETTJV4Yt2!QxYtZ&m209*#Ph(g5p|DCQXa@`v8lqL=vg56K zrZPO-xHsB`l10%-Xewf^GsNn?+cgnI4j-Om2I{=!P7;dpl4F|;$K=>xE0YbHi9$lU z&Z_T>3BuxB+o2Yh{*F}pm;$%mI@<%gE*;hWt}WV&v4N#CQ*8DKjR_CAaA*Tdn?_tF zI1F2{IJN?}L>5yAP(Sq6qNbn5%d#68(5cJhB)zh}$fB7M)m6N{sYm5+)z8PAENqd( z&VcAn5o+m$zvrpm{aGk!*FmYG-9-O-lg6BdVnCd^HhgM!Xm)GTU?f2pRqYCis|wnC zJL39SGj^j(-8}J|2_|wQ#M#|pSy;OY@h6OH_iwwro4;Rjn|Voy_E$5N@0GS)Ch<^W zYCQX*O^LhSs_y*Fi!NG{nz8}#tkj=uY?$*?kCNK(9W1}9a=AzDsgwyj6Qx9*VR=+) z<_)1juO;)_;epH%2O`4bz_h&k#~3aU$)*L!5L23vsK!k0+Ng#z5{@N3Gf2*0&irEZ zO6K-3^;Fj^<1>ww{eCyi(nBa&9^#%^QOQH-%B3O>Bf%+Za-Y8>cBtHq!v@5cxf*}; z->lZX?O0b2nbg+du%8`X0h6EGZr6hSqJf$c8oEVRC3J+@`BEBaau!KVye{MKh76e( zbJ=kp43ED}p9wrLGIJcPfwd`>vgstASfTr$bvhOx*FkxQ0)o&5Hi0OXLDih#r!ZAy ziiAdh>2%pPXnbjy;(`&`Yq^keKOLbbr)T}T9xi2`%i}BjYggjpVRdmu*W|9pJ6q(q zx<1-6GDn!j#UOgCy5u=-zkO8eY7W}kX6#awwn64P zd3>8kWIN(+jLa4|OMqMcLStz|mdwwI%2tB^#lb}Fr1#JB$MxlbB?uQR4k#WZRmY#? z7F3rHKN`~D9>-0qG@lIC5?QJ=qdD;)>A(0vshS|PK&smM?aO*sMi}qzvp-WE(!JF% z`D$uqK`jfQlaa=D%J!V%3YZ}#2rpVwN- zGhGpVepnOIMbwcl+&C&D?t67nhpABGQY3oo3`S;;kvin$lbJkznGwe6bGi&n*FfYjUm ztpRy#&8IjL@ zkOyb&fwj!?_aNDv;8~v*Q-su7of%g~?@ZALX(|RI$PnW@-iykRP=U^51>Wwy%ib;W z&_2kMN|ytkLO9^==e_~grbPDqX@PyR>{%-Y#Su2t5CZe*=6eVH{f34fK)e1AK>RoP z{fiJ8S?C%5mk|F48~;yu8QK0DLafo6jKyt5+?EUU9@N=^WXA2mAEy-uV!s<10nlaF z5XZ72QOAE6-Z zD_^!5^@^_fbFcj4`E&C0YLyu;%PA}B<=5fsz~EOdH&P;j?E}RjH_@^9oE3#XySt^M z$wOJT_&!LNre+B>LzXpbM^|Ug{kb>G#+{uV!;#B3aC`c-Nm7U7^BMU&h>5IxV7FWx zD8m{2xcxHhSNAK^aPB{#V<99q`QvPIkSw>#MzYvTo0QSymY`aQ>paGgEx~TLaHPcB zyH8r9pnLwfXfv{10;x2^o8$M#iRHWSZ@Dt>FA08#`8_fRLkT%J zWBn`hJBzpY1_89yA#h%TY0|yLYeNhC2(?)mPgHfoSX2Ws%{NSoKtb(MD=byLL!EPO z17v8lL{E`U=Cy|L(nc|n5sZb3?_I7)Q>3-+H&G$vI(6b^cICc^Rwx=Jr?j=<(lt+= zxSp`mIs!8}(^IlI1t)IKVgh9!*=AiQV-kqZYF32qlc181E1h1MyV75(i!ALCe|*b2&{}+Vu&Da~P8Y*#pMf@}NM? z-q%68y%q9FLMn?}RTo9Q32hMw(Ot)=IN!BrGam)W`%j-99fkRqnAI*s+NKN`goJ00 zeNJhppxk3NWY>bgcu|NfAvl~@*QRr6hV{%rv=LGQO&|21=$X*`W)7Gf*a2I{=Id(p z+uz(%^KRj7jL|c!{9BxB9JlRDnv$$bE^V&~r6ODjOZi2;>23^0opj)FZIGdSCx}bD zWPOgp!`gt|#;8;*5+Pzm5hSSOW|2XUb!kUz^X&jk=l~41pz#TGUHh|?bX=m2RRc%e z750UBF1~2sW2`FX&Z`azc5oeNv5hoyTd8C8F6wwzGUTz6>1m+D5o2d98I%510f)1!C?+v$DL z`qT{!UE!Kg#{vc+pwgYyT~=fj!cqy;#Q>`2Em;5AHm$oI(hnA+C5ds<+F8vN(iVh~ zO@uSis0pt_GDf1yH9YR21kgxi^q-q=v87>cv*&2B1sS_~7Ow7GO9Y&`Uv0ft!0?o^ z`tZ~~oQib%{>VGKN%MXrb7bf1mTFj1q>b2NH}p|1C-AUTTrQ&&N(RrmCXDO0 z+g&ILcRZ^quNYJHG^IxLB~-#byLa`x4HoDtDRXKmS}#A-<^%C6d9nC9^#htHZaWRs%7TfiT4lA$&zQ>!^B0?W2Wvj$r_&U6I31yC3 z9MDF!puk@)eX{|6v(i}Ws$cxsfVYH;+IbyoylsL-3EXkaod(x7s3sRPoJZqDrVha3yD0$@f24< zTaF)2x_)W^N!-cMe&VA;8Mlq*6a3L%w+!He3bd}%U6B5$4J=Hu;yJ;g)J6NI%{zYB z<67Kdwal;=J4au@PzAybS;B991ughisEgVQ^FzZ;UO1v%*7}pSABc*Z3%LMe>a4Y4 z<)W_^cuL#Yl?mC|x!YA#yF^ZzQn0r^S*>Ys zgctvYuu!TicQq!Z8@$`Zn2Pu!3}cJE&V2V=*34OL7#7KGbNf8$x2#H$SI3h`ctUNf zYLJ|yxFFXLjCWoh?i9&JCG1iQFIGvhw%})*@eGmUuz$zbX|$fqM08a=OzmC)9m^ZT zu7`l9Q<`G21ajx3#M-=}FJET0lMlgUcUE)xhcJ@bR?&$w^k$QH(qm(l2K_|WT|eX< zmb03Eu2>5wg>v3G`cNSX%w>UG!A%716x+T`$Ngk=#T965SX>eU)=q53f5OAtCXDK4 z*;QDIJk)3JNo2EW;vGCATWH2Z{Mn)3SM>JD7LF6&J3>h8Jq)HSTg8&z*VaEn{n-2H zwkUMRwR5RzoSE%Mr`(G1Pagh?v1EyljHyZ{iV76p-E?WQi(a9v0?u*-uiVH;sjRae zLy$h>S7P-133g9Am(E6b>ID~r zSc*n0!Vn~RPbU?!iZ>M#!1y(0BK78i#4}%cF9hbI<6$~LPgDycCNR+qbjfWASYn(xlZ8}Ye4+WIEv8A6_O!lbjg;|lQ)3!*zu!XPYs|YZ*7+r# zI8I3Y135Yn?K(Bq0?(GCCXA!)tnCSI`$^lYVMC#yw<*JnMaBGe{0{aK=h%Ju3_41$ z|G3Bl*xz4fgBZ8I*?e{BrM9j{Du!QgV#RguYBrU5Eu(Vb%hHm~rVN9lF7)(mZSMn! zoIMT14t_>`?8_=`FYU}K&j~U|kp+3o(alwFMvpo`>}bZ}E604C74?uYRPwLY3eq-J zY)m!Em+s{`a{IV?5Te) z^L#9f0l$6z!IVa{Y;zx4DQ70WhXLCtmC%O@lQRQt*u-wwd%st*8t!|}#`ZidkJ_;4 z+Mkp-cWMPIt)Z~RY7p!=6k`p-vn-nf=yauBbW5&Z{Dj(h-5|C~G>ug4t+KHi8$!=_ z2tNxd=DG0Y3Dmj~CIPhmezJ6)gc$1Thye#1m>k~r(#LxiEHq6yQ^3@QrV5Efej&IN z<*6j%3#>zl$YCmd0DU4P!^ohEdKBm_xUT9C;@}KFepp*$4fMi$2sOK;99|3Lg z4?o!`+U)s2CIHn$m^V-tUb8OF)9dZXoHm)?Xmf;xkO{>%Hm=5s1d$?Mhwfir{tLaj z-%vSh8FSL)$#evA6?wu|J=VnP>d14%$vHS<-@L#!TAxIo#`}x zzC-2-60BhE>X2u*xSNMp^H>urS+F0>b&y2S6*VriAvp~XPp@o$r$r)SsrS;t_y#j0MIw5DvgaP#2t_4g2aTT5u8L;`rG z$f4@Hb5)cX5^5%WOI?}w;uMQ~8)|L;@zt3*a@fFcGFqV* z>?D5X9}w{)nV&ysied@Wg~61+|Km#(Zd`AqD5WAhk(jN?1T31 z8gDE%zo+mnb9-N>Se+xl&9b`tD}9}V?~5_vv>?c^g?F3&JfTaxN3tk7$F0l#t4db< z&CoXWv8-+3JxuO7T@<`UCFbt2*gg^NU00`?;6>)B^HSW6=i8>==ofK#q9^!YtYj>HDR6$l*FQ9@8eM`EsA z>e(DxHN|NGGWu~qy)I)+1sc)LTmT~l%KM2%E1r*OML4L4iG;uPqrP@}_3)qfmW4H4 z*0~^ha*O^~pETbV)muO(QKXD4>nR|Cu!@@ugSt(s(-+Z{AgLl&7ydGZ%MWKaCE;X8 zi0{&iw$(d_8;z|GkCE_ufZ%pcY(J{Y&b6I4T83$CzPR*%Os~c`rVB1AkBM6b>VC$7bZ>b}N)(kGI@ z1Q)OnwVaK1EOzjz=i^<50~SQ|1=YHA9-Rzxaz?cHaBuYN+kOC-f?gN=55LkT9$Rs@ z1#Fn@QysPRKq=5pWFAj71-B~{)Z z|I_*F==Tn4Tm`374|X)jqFQ8)Y(fLTQC)R-^ z;h8UOfvh!pvbyYzF{uSLV&EmkQ3nKv9YC1EJiv%Q1EQ4+y z>>f!VVNOK*?n!-R67;^mJkUeQ%Enw*^5k)FPB93p#S_Ekl1>xRWa&A97V{T2o2{gR z=DcwljL0XQmKE%7PY7qcDQK80RR!~+<6h}|`$W`${qL0#Z`@U_O7w{9s|(3fzU>=6 zH|^SLu&ZG*C{v=x0y+P9Y5(Ab$B-jd(mxlu$&q4SexI)wFf)NJ?|@1Zc7iSMf(qW` zz|c+DBa;qvpp4c4)}B3(#UujbA#! z7!exLBg7o2s?{tGp{}6(&1VOz58pu)Wuj8+Lj7rw%dSfYPsE@DuT&j-ZsnfrVc=tj z_j!=bnMrIm(!U*e9-Sd^F;%;#TLH4A=P@&k-M;E#3O-HLM0sfdB4gub(U?$9hAD~8 zd!nW(K6?f=wLs}X!T3VbNGWmZ5(#Mr^g*RL6QV~UIuk7YAb#S zH@c`M)QdVQa}FRgZ`?@qqo)`EX+)Z z`mD+%a9|4SE_@tjE|>Vfe$EXzF@~w9tPPlHmuRH0$ZB_7^MRT$8f_K2k2a%qdAy}I z>78jh(%=t8S=yZ5BZh*+2S7NrIOxr0MctSl9dAF(C#%*i$U!%!OW0$mTD4eGfhXnr zaPyA&N-U)%jTxP&hH{$wnT+QuyrTmV&%fz(pOOWlTE71Gi96@T0*bu+O!AO@pN`-nC^*c`wV)38VcaqiQABUulU>!>8LRL0>p`Wyq0ED?~*^^N6 z26Vk=wHA6-cN0=PM6~IL@oiT`@rVtbKR5hp%&yMVO4pk9I5;mnLkZB-?l*Jr-0_YT@GlXq_>;|?9@B7Se1`?wd4jW3wL(tWUZRP<|3VZ2H3*InWl3k2onO<= ztCm_bl$9{9pBa^1sk>#}F~)s3jl|+_zPns)#^C~6o7*huBW~VQX4q*N)-z78R604{Ey&w-udV%`_vt}klFbMG-HE+V=If<5f2^dVM z(4lB3s=AS=FjGoME~co9og5ZOg%D7Zu23Z5ZbLMFZIpt<=oc$O23wBn(vLS0_bVa6 zymix#B-S)ma};+Ip4{pE3^qm9kgf_8|2lD zC*6T`C}ZLNatkarS#_Z?Pb?KiHCAujg;bNWtFWB99zrCjteV$HF8cGBy4FKYMO@hL z2i2a`mHuFDruo~Xq_Ac>;XY%;%U`k&9F4ym zk)+)^hCMAcC~V;&5w1~%;7ZKbsXIm&0Z`k2&x=zRmiq;`>Hnb&FH8baHz> zmn_3)JD$z@oR0I#^vA{}o13wDv8#KC@&w+H<86zHb5IATc#jpN1x z;&aQUa>ndq6?X-ua0l1Mvh)V?*cH(1F|Y1{jSja#<3`F!+4ZrV4fqcB}%5;=egZ@$D=DT-tMz9#(6d5y0#hFt> z-ibgzT}*`AExR5LZ#tnnc)xK^cU#>n3lFD`OWEU|${NZ4yOE?kX7^P%+QpSARW^LR z`9zd~FyWBnG!CfYDBqaqo*dJ$C?UZwx}>y()`;6EMCquv#;bSxRNNGy4m%qLt|&YY zM}?Yn5|i7Pag4y7&4$d4)=L#jNILT|&pUNEvJhL6SptV2ta~$2iB*!a`#>R$u%=pE ztxw6{qn*?XmW7h6Tc{^Cx&4HD%`mx4JBI1V7sg23W-5yHtQsq+HF?@lShA+gJavfc zlkY-torA`R{O&dq-SCG)3-5i^+R)zjbI<|mQ|ti>JnMV6?#1t`ozW9}cVvOiRn^)2 z*_u4M<5ECOg#49a^d%ToVm5Y;I-J7x`J8OY;Pb;1oLwU`f$fkis)KQZAy}$U=`Exm zrXu_BOej{_^FnBlFfYkIy=72|`23yYc4T;ClH{xl`Ln&d4-jvXGdN!+dQmVr9Ba+k zyM_7_R%=M!)O_ADbqdXlY0~{ic>sR^MtJ;yQJoKM8=EG`4g>){%JK+?QjUG_(_7ib zQXE5|kiT~kfEfCj=Igr)qFRs>G+E#ZR5`GSEML8_@>SsqELE(L8^a8dl1pnQ(E@#Z zx!pv6wZ5%wG`URP5s>u}@s&<;r>Quk4r=$R%!*zD>)ur7v5B+d0W{NXCbrM3zY+`k zv(~{mC!xb^@0<{@ZH@@gt|omK>3NFkTua1=U1a ziY7(8P(wjet@KGNRorV;e)!d^AUhO;I=O0CIRfkoU;!jKfuMu(pK%f)dW!SCQ*UOw z64a_Uxp^ZPF0@&Y;95)jY3Qh}Pj5@3!;K^65-Gx@XRMELFw+5M`uaWVlp#2%mUhFL z{a_9!I6HH+3Ma+dLYcY{?TC5765PIwzlIENgwSr}=kZ_>_+zvV@Vq6K1sqqh$JD&L)w0LbQ~(c9KmEjQCi!l06ru`4CdFtx^W+-ODFK( zQbC~TQo+jqX#i$&jDbr`Bgs-F*`N?vE#KmcaZZ3&>CuzFTC!?qxXVt99%LLxpeBJ+0f2I@X>8PraVX87lM;yAl+P$w0RvgMIj#Mv^%{ed}LM%_gM zxXj(rY!jmrKUmnSdKtyb^wTW2+Gq|W;X%Zr6y8Mba+t?n&$ytwSt~Xs_lWY^zQj^1 z)!+_5$hxQIP;1phP%WcXoMBHptf&Noa?T&)`wEblR(JJU^>Tc0jxmf|=rZz7;unX_ z&GhiQF79celXFkSJ6jDrIe>2H*}>FR&RPg7J&>&A zAt{ioJpd%+c*!OHRUIQP&lFSumUE3#swF$C%{BsWX3om$s$LU;cbTpi-Xn$o!&0BM z(GnxS3+H=ocju7>NMrV`oxpJ1Mj%+>y^#e`IMduFiF{J_=i7rnk|cnZbDlOhwsU$O zG=UKijPMKo%Q#|4(vC}&O70!EN=J*7RAJ|(!N4fMAsknR+0MFef^=x5JyR$rUw7aM zYX2Xhu0;zUM>(>uAjXokS-7sq=`e_@DqB{DLU0XLaF1r6-}0Q#T|VxU(QOA~b!Rr$ z**MU^{2n+AAV+>(`g1n9fb+L0&t08RzFfQrwn@9=)3u1wwi|M5yX=ib!u61HE1T+= zgiK=Qatp`W4kVr^mDo(JTR3A1l&L-cv&P*c7!lwV`gxL*K!OtM@6r;WP)G|Bg;>sV zT+q8rK{IdzyvcPb#P2qM0~zI{X@`TWq63YMXz6C#~YSWBJ3EDAa8N0L3IG8Ht>NVV0pceBq z_$mP|R9-a&hs!9SXLe>ds7hncB^`~2VNc(*JE+hckA-JUl2EV0Px|T|0+>1(vD-QV zYhYuziqhs1ceTUe;{4Krg`Mo2?@dbmOJEEme%Ewig(%l5Vr3?^X+@n}hi8fKgbvS@ z%kvsfTarmYeCM-geW)(?W=CfeWmDG1XeK0`^i~s%c46+V1M=LNv;v@ zIXYE%@~_WkzZQ<*$lV`?FqIfv!=;O-3#yy7+rY_Fz-zx5D|M6AjwYdz-eMsKa8Y3} zOU=!0Fg*DP{I)P4VPSh0p{8SmneF~58O+>T`lh>OCzK463#7adc~`2{qLo(h0bRzk zu*f3Gu+Op8->sDBG-dvCBS4}Y#95X6v_c8A*P8y|63-g0WS;B%N!FRxTRyXX;{~$s zds?6tR3MpB5)`M-$Q@wRmfdG)2ZLjQ+H(>qizhob8ljS1<4dho^sR|xTE$uFUEGu( zo-%Pcw7?0MkKn!d*P%X62(@#@S?#ced!b}gU+;>MxNNt;5?I(?-qml=ym>;+j{HYZS z($K=pgI?X1KBM@7dukxAnmg^gxN8!!9}5&VBk58;G&!<|pjevM9QW^sC9Z}Mky9Tg zbMlFGuDu&sho1yf^k+~#NDXaBM_q@PL=Q`?n{h9~@QwSK!$2`sLHniOmNy46=2yOq zZIZk1-4Jx3NI#KdqmVMTYPJlYYMO86f1X{)4Ii4a@%)J$Cy4gX;ejJ?8&P^!^RiY;Zl7^}PnPS}Yq4 zo)ULD?Io7*ohg&0C#hEg2_uSzQj*1Mw7;LAW4-{^4QAElj`m>#{s4g9?(u$COZje* zKiI$B9&K-@aRzR$js>o6=ziK~U!&V^v(tk&pTJ1wy^96_*IPGtKZRe4#0p#Q$zUc| zH+S~;i$ANAe^}a*o8UjwCjZp?iX*(THCcNrQ(foLqCPWHQ^N`YK7Cd5Sa(1Eb$goy zJtMThb_>I&h5LPzz_|Ncz}h}d%*0!1qW~p7;28ICR~-YKF0XK;V!us%ked5NLxgU7 zp^&Bz9Kq;xO3kMii0`fVHH9CwBmjwj;99g869j6uHv7iGhl-}a^xMzU6dTj$_r!)K zsFVy!Q{!oT8An2QffiCYc&rjm5x24LSC(G9ed=BJ%1~=Y}o|^t@#gE}u z@iqO9E9N`zDqwa+u>|$ z&3In{;7&r6m#>}D?oWAi`&zmn;8uRl)c2Of8z*1MV*YDwG5g`bkCZ6S9j7{CD77C-kN{el!LmjL~Q|bDL6crq_Krt+i>Jx5*#Cn+MA3roN++h+zCZ?1(!Y% zgK)Pz8XRaMjcR2T$sBr}LI({klc)UbTH+=6gc%RVk~$NaLrmK>@=O1-{^*CvaqS^c zeCTM3-)y(k`e!o@7r>dwH3j_GL~ZAn#u#V6W(;S+w@nvx{}!yKb6h~WyE-)yRo17X zC+Hnu;~jCL>%ge9HbIWuFZw2&P#M8*KWu^U%&^or=Ey`<2V2|~uPjO)B@&B!Iox*) zlBm!S4%!NH{!lw;G>h*|eFw($f97VxF{*~3ipkhA;`6c^Bh8Wq_#yY5&e5b3O)PJX zjhp>@vC1tDzlqeklE%pZx5F$sqv}eC%MOQ7S>e77D%7;L<<~> z{D_-4Be8!%TK1?~wK{2Ez3=FG0N7}LDSBVise7rO4&9z|rsO6i`U8GY(m zb6KL}_xyxmApA~~Jsz3nK%34@!*OxpuYyR7A)y0zy>`55U-Hsd_3@(Z*5{&B>M!mn z8Mmrxe4kCWO2i}xt_x9B2egTRU$B)HX&{u0)2b?MQF=E*-PSTR^cKtnt@9sSji; zf3S<1;0Y#I0Q8HhQRjN{&}Lf@xcL^V!rYl*fHGz+3k+s``m&>=P;u>&rZ->I~o&vcfQftDe% z9Cv%Uyt0zmcq|86`sa~zz}^0YfE$fAce&B1!}jDXuBfTBXN&`R;1iC%>h04VwV;}w zw(Nuy$8~jNtzY9Dow(gi)}F%xZYKj~Qei>^u|Fv&>5xd=)1H>aScB7Zhv&!+&NXKo z{$7UDnQjM-K4(N8l$H?Cb>5YQn8dY`3-REz2`|ig>q#b&iY|<>>FhIqRH%vVzRr#) zY2q-2oa$yy)RU8gv}*da!NdL}TDzG+b_0tNB&dQV;^1CliTv@wnE})LLQuzUVa>e6 z(QLfzt5pQ+Qcq*B4tc703tO3!yL+mzdys}mwMlY7XRasr~G4>X}pontcoP>Av>28TVjtugnRl|C4yN&_Ag`bR{Y z)tTY;$lII6=sBoiAb!hYRve_N3{f-%oAKakp|Z0OY9ReOp$t2)d}%X|5Gx@y%tGZ; zWi6w%J6_kuk~|f0{u@Tqt>&NE z8L3Z1%-;#ADj@k$TlWq!P!_ow{TH<|9_1RWFvc`-e z`R$Jgw{ugLgQ-W}O#4{vy;NeusVHt?rxlQtR4|?<+-{m99>;JqhD+2zA)AB+dvobH zUMjNlIhKc3)%>|t$WTv&zLulolZ$@kTIX-^!yfFbaezrfCZ@5#AOafRN1F7!en=9) zws^z%(d@MNd*~#;O1$MYSs|D;AydD1nVg=>B%I+LvWJb(8H*j$22uF< zXkRP$Z^}(0e?=`rpE;Af*}5O3+-A`6>9!Z7Tvwsg=9}}16DAg&IdjHs+02KB&`J>- z>rFB)UDOn_S-w~dK~d-9!}Zi@hj%s$AY{gmURc!cf!{Cq1E>DGdA~YaH-5Z@{!L!z zqVXeFarmz1G7*Blc0w2-3!jJAH`n%F?8rqx2EjNxqq{56h>_2qLHr^!o?PCgCPp<3 zgNysp9$ZxC4gRn*aQF+A!TSlqIRM!H(8}0UcA{3_cOj`k0SHsZVM>GBfL9oS{s-?a zOE7|y{GAka_YoFa_gv$aHC^~SA|`JrG-*Zg`qpNf)*UZx{eP5EzrwLXAB}78=(VRB zEYysm>9n;*=_0pC2ZNUeTZ86{&_bVPX6+2UgI50;i*s_4j7j>LJ*?x3H;Ui5jqAOR z5p5{9F@c}_MCsiffpX0yBz;ky>kB@^zUT{v z_rt$qDN}oiufErW!%suG(|>d(;p!g9^U$!W2<=r5zG?p>A~S_GDv}LEK8VpbfJcMd zJ%~RlWgSR-fhb8?@8lo>nfoP-FN(<=w~^>&OFN5(+#^B7tlz`17VBw++Jlj3-MoPD zdS%Ry{D)j3Bff>|#k{0pn>Hd=+`4H$pyuIdn{K|xvh1qs%wPl2V9%NO4%Q<7!%Y%}Z;_&qL?dQL{NzPd+Qwc$sdJ~EC|MB(~P<13-yD$(ucyM=zgS!N`;2zxF z-Q8V6(4fIxLxKbg?ht|#T!IGIdpMcQWG3@{|9kJh*1HZ(clEBS-u3jZ{p_l9y4pO6 zmMh}BdX?{8rjFQ#Ws(PV>LOXR8{=Wu`LOy~^fB#G(7M3(I$CU#_h zYI?JUu5$V5dG3eMSEC zz1HhHIF-af4V~me@vGVZ<*@j!XW0VUndQ!|Q?;?d`6uH#;ZcV;=-eUAW%y3V>NNe0 zej_6{?t4)+$`C||f&RN(7ty8sZ{)n&zmU#;M-P6Y3PrH3U2;-xR6I`QDP_eV5xwss)Cj3S4$UJ5QMyjRjTO+RG)nOuy zS;p3WvWw^|y(xdEvcc5%uzf9#-;T7;>HnV&>d z6U-$ik)6eUA<wrGk;UPb^@bgEnBxDJYg0he&9K^J)F=mk??^Smo=UbG;_$N3jyQ5hHz7Ni_OuPHtx`St)g|WWhG-zH(m`#%E_==?B=f$T zFBEl){1!IOo1*@SVR-O7$s%_bs{Lp}z9{F>wsCDFa8Ab51@E)9#&|Hk33Ys>yOy=sQpFa58HL&J&W_ zc}o(L<#Mq&dd_xCURbz&Yh*cy(O)i?O$VEzW|nTk5n+j=e74*o@{HH)JK?cbrQH36 z1PK9oquf(1wJoT|1w)fF3JJ1@W5%eBTJWpUP?I3<_5w(R??v)9(4J;7Cwp|#WLGIJ zcb`;W>^fEYZTb%Kez@gtxb%D%@uoiQqJn1F?vk#)vTga!ap5k&?*ZIFE!62Z)&{Zh z<1`gB*I&O!VE=uZiv2&DrixLOu|sD@Xp6fd(MMgPVy z()2ZIVDP41TTE<1Uh{xiT%X*~>_CZ=arjcES_;iSW#}Yl2o2;gITEA}=i9cUKpS>N{eFAgL zM240}c|o4X(t-!47!;5AiY3-~WU#+S((pj0bDOW=1+0ZHjuPI%r|^Qx_H`?Y=XygV zWT6G|_)3!F4d27!$pCW#FvA`*$?^GgO^0;0`_6m$+_X!1MUY{A7L&TfZzoA2kPR8j zzPqS;`#ey>#C*0IEppUoVC6v&0#~lY*O*qfOomk=i&TTv86%zPVXs*$k6>RvsIdg= zpoHbJ%;89Nf3}sl8E&oY_zpd+6ETciOPo%6a7P0LtT9B+emz*GbN0$7L~tsvUmlI3 zcDK$^BEW{cGDDHoGaa?`4p!FTgPE!qJ1$F;)U?taD+MD@ujglsuRA$=FEO5KUIx}* z6cW$SEqPPxqh=477t1NVh(RJ8v{xJEW7dRyd-wiJ=$fs&kDm2yv?eXg{% zT4(3x6>U9ZP4X;%Bd4}ZdKYRUDK{KesNj|1s@@ZTPTMewD(BnKhxetpZ8|hCH%TGIqTMB-6Q6u)s59c{ zUTLy=anzRR6z`SXPKP4T)CrHRmB*`3*MFv~(8X$YyS9mtOZTb4tBS~JUaHe}?OueH ze}U-TUXBppfjPJz5ZC!#uhdiIOBkaGrU25S`rRE&2u17a@15vp=*!8*_Vf1>9KT1t z9RE?|yQm@Kgw6?!e5+FPIW`E&wCrq2a%o9|QNF;75ySLCi$KkzFrhyPRP;uBnzEnI zttTcUmnEKU-(T-lX?<@?;&*1bf3>_;H~rOUCd*f&|G@do7iuS4=Zafk@4(g~;PB%a z>?h}W^|BUJ9=6=q;JkR->N~bxjh>8zRh+e)9a0Rsl@!DIP(?juToqu#ANy~Y9hNLN zR8xntdp)XNJ(a`nW%eX%$S%J^*~)Ut877*)F{aS4-GnaRv1w8)y%@Q)^%CABnDB+f z%fwI!3)_oHFoyBJBq4L-tAz)Dof^l>Fc!#br4=HguWu*yWfs6v4RZD39B_i)310KXZfLZa%=t4?qP4c?YGd?*8P<7q zu*6h^CdxszYiJdyVSCT|7H-z8-?=gIBz(FpwT@z*tVlqJ^e2|KMY#rpb~^Ht(t7JU z5+#UbD28d3#StYx&QC>=;-%ydOClB)R12|J9#hxN8nYUr56u!A!o!9k?D{FnWf5CP zve0UEKWO?qW9tTuHQfNNt%_{Z{kmg?G16{O?75JaI@0NYY;@W&8{QM)VITP}Uh90z z&A0tc5(D4B>AoS-S>9%MSk70^>ChA0dTH2FS`@mmV`kvqcsXinj&YUZXi)hYUiB*- z5GaS_OHs!1lD$c8_$1#DIfye^q3N9*x@19jP^iFN(W!zyI)CAmb%Q3~p&LbI%^;iT z9SHC1NQPBC5L?G4Y+>FLX8r8d*y`(3;x~n45E%2-)U(=D5=rn$vW)#M9b4W}EW~dr z_?6V6sVT%5?zw5duU377$NfN7DKh2eE^3`s;FYzQD>u-Kg>X%}^0^ppNIh6!r}cBsWSMA2MZ9)`ozhdC7&tAaUMJ{0 zi@;0bhGpn*elPz%bv=$bZkn!-YA5T&SgcZL9%VeKGSqB33K)UB^z^<+6Zlo&Iu%04 zJlN?0-@Wp!GPaRyM{kg0$*?LzF$?b3D7u=aEf(aEL*;^AH^?-;dTlDODOTbQWn1paW(-Wrcwiu!(-?=mI+Cw&R zs~-8oqSfB3@VWCExa&yIAl2`)@v0Cb2~0DMN3=7-ydVGa07&T_02kJ?|6W z6%!~}vcr1upedS}$|0R_SuA7!Liw94Pg zj~~r!R-|uf=gAFsdwhzi3QUOF-tXk?;xMxt>KR*KjZa>ICf-c*d1(fiV_TcfF)t(q z(`;k)J?SMTV%--odto3yA7Er~%+7n4!VbN~70ScjUWKPNT5?Mn#XwRkQL~!DgnW79 z_%)x9(|(7SB%3IJeYJN=a6D_jk{w5RGv+P&WsC`i-Y9G6Fu>PnAz?`rp1KtQYR}ZT zanQJ}N#{=5?*Z(ndvy6X=MM7Ppa_YLiTh9Q{(FSP@gGGnER{IA}2NE}RtWki z<-`(1(%VN?(uncvV!dX|5svP{@R2d2*ARp~4_Xym$nd+|xkMZ(!_WRg6A)-|y+$E- z)=P-B5)=CM_+GySi}B-8ps2fctV-A9DdI#i*TVj!<=Y;E5>|K4mI9=4;poO)?R6Tf z(7pO>>?f{%pW3R<(Pl85apB~;Q6TzR1z@YY$aYJ!X1eTN98^j91J}_y;*D_x?~SXo zh$|y6VO)ijucdz*R%L;XO(2B$AcM=IkB<;mZb`LxMB`Ix-paNgO#U+8_7K^+F8l39 z?m-@ITXt{a1hP=BZQc?AaCxj3eFLE$CX7CwSPLs#pKoqRiK_3`?u2+5^3q-vW>Ved zfQya2xAaZOV6fclpg&4^8KZzADI%8PcYrJ{3HAB7l5@w6jS=?_tI@}{rPl+Esd1d8 z!4pG)&^OSYLq(2lblB``rNXzBaqTXXeK8Z`V^*W7cU|jTaeY+mEbhuhJ( z?E-UfvWnF?MqTS5#aB2)L%zpMhY|_LmyW%&1<~CQNF6q-_T2$WR*1HNxwNJ;ijgS% zU6TYCC=hQ(KW2DmWKdp&bFoT5J?qHmN6gP-D9^iZY*g0O*++aa0Nq-U(4i*KgW#@J zaSm2cIIhPgoGr6f&?#!)kG#1VTbO7P8E6B`bS>2BdmdzEx@q?GLMEM_KHM+@3WK<{ zThX%CEetlRfebk`m@QwyiP7H9D@`kCIw(tP__oCKd4CCe7_xdVgHcFlxKgJ?K(abm zt9}r#BrbKUV7G}mia5@J0P^gccc!z~oC{{5-1{iQ*Y=Jx?T&b%Ghe?4BRwxqjcjTk z>}1P96C7ErsLf!GsgIKD-HE9Ywn%~9mxj-WJy505pvJRzpitB3dw(5bkeUF&%44LYjYwTI2VGYkk-jsopMCE@0vKFcFNM| zU`$l2iP_|E6JGqNG#w43V2#DAQ>H}<;BsD$mK8_phi*t~IZ4bJbd;K(Vb(mK!*-Hs zH81AkI@_5B5Pn8_DHdJI=mouoo{{UPs$7e~-~QhfD6FU>GraQ{+4X zeW8?qJS<=vBME=$PKw4 zK@!Bwoh%?Yg%y!QAvUxlraEzbPaU1?qkYKkq7!s)g&!5|IgtH2lsNun^DW#6hmnS1 z{eb~?BQt$g&ghII@}v&#+L28Ww|**Cq3rIxi@7QBkrR&v=T`nH@ufR-?W@Bt_e5~* z^GHg{Q+uR0i#Fs_nc!$f#da(~MCagf5$^SAbvD=mnZ*G_>>j)@_b}hguWJi#gw)OA z9Zy7;FN{+Bsfr_6(x2TX^WSDt3^10JGZR}Bx~aGX zxKZTlVJTr5dw4w2;-z}}Oa(uI>y68ePp_I?TBeEhG!Evl{a^8Lh7GbNnueUP zI~FRF9MMu&NpXJGNq%9C4xY5&BuyFSfO6dGDBX^!>15yfnhla9^j$s8)$BrF1>5Uk zA~U7rS#>4sPXB&X=A~yUGnU`CH9ZZr8$7&H8jZBoX{YPpxaBG^NS&qyrZ&o7@g~N2 zx|+Ic;dp7b$lb?B%_tVqLhST&vu5%1#mK$y$?&Z6ak+fY7%Ho-A8t-kQKh}o)P@U+;vdA>AMQYTbAf`zmofy-2g+Zf^}gKl}aV(tQciKyBp zS*LV;EEglH{rS8?M97DdNYT3dc}{Wk>KP1j`mTM)s?dS`$upR!ybWi8MKCt^1r8W1 ztPa+PXH_0S%kPCy8&**-F{q{IHt`jtmY8NWigPV8&!U0?ij1Z#MmbEY)>B&~E?%Nv za4HX%SEfH`2vl?MZy|E9CA@FyR5mGQOe$YYUi!Q_IS2Q&G6sCAoTOdsqjBic(@d|k z(grM+bSJ%>u_2|(&15^**^rFRYG2Z-mfiHWZ;Jg5T;DO%vQr58RLIm1zHH5KP4dF? zFJ`-yqP}_ww?cqfV0u8}#`@LC&+|jQ3Hm4Mp~+M3dW@Ysc)1mZed1PUp0Ib@Gzoer zSPf_{<*Jmn6IK!7g&wKATCfDS03;1TDh*MBQm$F~4EGz=rA+52OEh-nRbSfvjq*Ga zZaS$x)6c`t;({cSsHX+iJnIZmOkuW#iySlI)aYe|rb;Jce9(%FxE^A3>|y;}&dGQ) zk;Gb(F7WDUP6=!UE7NQuWwa;8AodkMP1nh6Eb!5@BfF`68=mM1`9NiKf&XS`Se6gN z!xM`QcwNB!DRs5tjfJLIMsrNh1RxIUp|`yq9Gm#2?)PZ$=TM)8?XUSVwm+VR2d`{B6K5>|a1Cl=fQpH`Gq9YPyR(Ecs3%U+KT5jQQ8vd6tWc?LG)_=he^jO=k8nXSD zF=YD{L$-gx5cH7K-!%L$W61U^hHU?WA=^Lgko~`mA^Wcwvi}Q)ps)CU#gP5Kj3N84 z7_$EhhM=!Ae$|lUzl<5aIs8pGutYpoyNp*cHUUKc&nZ@XR2n07}ek@XR0- zfQKyb%s(dom6(~}nL(fcl(^tQmit#tAm030({I-S5$R9qFW33Kn#XE?X8gUH#~$)i z`b#yxsQX)uATs({=C>L_?DSLmZ#DkaLJ(*C%=&vp|Ek(wr9uAue=H4h@IR&hrpCV@ z4)VW0%lxJf$RYof{#oN+`ha}nPx)`9LC*50^xsPVueS;0$bKvRFHHbBm!BDbQv&2| zeoFsT;$Nx(d4Qi8f2#)M68@Aj!E^p$!ocT+IY34XwDEtn{NGFoRPv9Sgbkcb9z6~~ zMMgK*2j?97Wh6E3tKaQx`nNft&_!{X=N8f=f^<((Qg2|`Oi2R)Rcef zrY0;YEb;=R8#B{CmE!=>&A%(h&h?9KEKEQpe(1)+`RG9Y_`ov}bAnvopJ#qbe(r%e zetg)u9=*xGeE!VwL&nDW=zv&3-QmyNz&vcASmMt!#O$2RzhFen^#kYs0UD6>4`?1y z`wQF0oA@WN{{&jp!qn6RILrZ#Yqa2jfY_TjTG$!u`~^A4S^g7p4RLuTaSTNTL&utSQl_(W&*9+{CLR0{CI=^_y8{l zQWKb+4QMEj#UA&pOhAAhn*dCMn)a9m*6?`z2*Bfcpd853KhCpqGZV9N1Iqy+`FRcm zHn7ZNIbfZCGqE2W_&=H0qxAo$i2*G@-p0ht0AOkgFtq@fS_2O(fWK`4m^m7_n!vNN z0UTWHoK1`ktsO1Q%$?y`xqqAhrG7Qb$FBBIv(%JT)sz)`G|S(d6f-DL`FE>i{`2W~`!R|kGVW2SMpNeZJ3#-V>JSxupTXzBlMgM`~fBCORD+F%;FUmby z-#?WTQ5BL`cnMTaMT(i_H}(D(=g-FR7p{*)@YBDtKK5x)-~H3vf13SY`+vweL1Tm; z`8j~?;{y56pS7?9yU+jd`J*E}N*_DU&kslkU<$aTIx!chLxJS~519QDB>YL2;)?Pr zYT`i1gf)J5kpBxKv9bSx7|Sn+0evIuV;K9`8ctx>{$u;un#Vmz{f0lEfId3a8)M?T^Levirl3jcns_0QwSD+5EG#~kcHM+Mpg z9SAFMbor>wWBP{%984UbBW~cZ50s0O9sY3-yfQFIVFQL_Y`{kGwE zP~h>aKYENl{t8S$rYdJ(1B@d68NCPtr~QDlehk1spB*?&!^Xy}^Z0@|GbdtZR%T`< zHh6%LlhNbcA5a3EwllDoG-a>)RVUn_Zxj({_W)Brmgke*sFIsikJ+&leRU(^T#lo0!m+=;-_S zQK^HOvw<2&F7h3mHRNRMoHdYr{fe+7@*^)8N>s+G`>APYswZXu0KkmQ5X0v|fOOO3 zlp^&geZK;%G=m%it&FUq{op8_;*rddtST6E|PoDWy;=n>r^?P)^>Zh@lIoC>$`pB!PZv;eK4?ZT^`7fQRqKj-Sx|O2o!Yv zPZs!ljQZ0AS%3`A37l@_WajwA2AMcH{{)aaVpaMKF>OW#_lpp~da7-$^Z z#xx807QlCXHf+$~Z^W99YYk!O4bS8(2gB=J{*+B`1X%`o0rlYUVm6PUc3U*%#vVn& zOQA-gMSa3E(c@J%u9Lv%?BNtjKjPv;0>Dyfd;)ZvTzf| zKt{)g{T%F4OTB#f?s$;my^sNp`XJG8UW|jSGJf{8)JKA?(vZa$AIC{B=_(4orW91c z!L|kKji{gOaV}IgbNX1g8wS=6;$E>ww<=HXlzvCC;ie$0K2yrKALoQ#W9o?Bcy;NO zO=EG7;3>>+?T@I)7eX5hqjPa%SAe?Y7cy|q=d{6svfNvWKSI_L>7d9^`aW*YpL)&r zTlj^5aGpe~17EAZuLeqv;5cXJ$G)*noue)$ZF6OpwE7&fbh1rj@6+3Tktu zSyLlExM~nJl_^-3HU|1Z0vz2+Yw}xYYtIq1>xl%c7QI4?N;YxRw#m7KkUuR23;Kd9 ziB6zcE1I**QrV_gj>s+`UiNLL!S&OlJa|V1M^qDFf0*B}SB^O))QOEQ@NniM440@> zGRaKG>dE)xi*~YFyKMCUpXqKTKZVv1JVm+NHzzKU7d*y~S zyxiu?k5<@1xORR%xx(l+yYZ?j2nV;dRDlv5C%`wa%ILX`d2P77eEPjG-IiY#zeM^t zbFOm!4DOKlpr*`-wa?&?3X-MN2_5a##_1FW@us1wj*e|nuh^?xDuOE_@iM}%?Za}T z@MG(Sx%Sl!@>Ob9Q=6$S?$oTwByJ3^;PWl?yZTph1fidFHx%|?%PRS{@*^{UGr74n zJ~>vQgkk=IEGr&1Zj#T#u6HE*ohGBO0yVmOYpoV9j%xf`;Y~7PY6|1TiPT!a+H(zp zueqYc9L`h{yKa4sx8x)HtM?e^1@E6I>V*>oJ$-)bGkj(nC9^uAK=}Ft0e0t(Q!uIZ z5xxxN_|1~79k%yIb4+cb467K=kvslo&@D_E|3Rgi{Z`l1v-9g4h;@c~lXbpQ$WuIBxLa_5$KrIpdAs zWx2_1azv*AShtH?;Vj7kMVDPg5YFpX1}{0wRd$`FH>w%42npqqOhUQT2_jBO#ahC# z#3Jh`z5@~|pm?EW^duprWthMDkuYhk{LT%aaqxcA#C4e%JF;oF+0Cj*S;3dESUU|L^L**7KR%JhbRnQ;w?0?2fR~Xuxak2)k^fLs@ z02A?lPE7vXe+(`djFW_fB%XDX>*|55pR)OIqix~A=c1`yo+!n1Gqd$#&Z@#E*uQpL z3=R@vJWzFSp9<&Uj8RbZBl3PvJA-rYoOv@6Y8e{ z#7y*>ZN$`EJkGD1I#??h;Wfju}=n-9oQzt68eqwyiw!haRDT zudZb}Px$stbcIm-R1dq7zdr+k_fHo_kO1KHnKHmK)X8 z`C6QQzLjsnMJ#!K!2Cj$nXrt1#=YX~T(f;}+%0HX{6Q8xqX_9if6h4!=QHba8o%Xf zs_)u$TsD(K;@wSB(dmwrm||B6`xLAt1A7pzR7Jk2(xJj$i5rcCC3-`^oMcQchoVu* z@RZjSrlkOT?3^@1&L`#h;*cpwOWua?bV-InN<|rJFH4$+==2v1MTH7<#U)eHyH6}J z*kfMG$`&oVjw*p1djRTHlM^igOJp5~J!!W?XStChTfn{t^RvhIuJ%&X0(uB=}775+_a zcx;vm%`tKN9~$)#U2$$F<6}e)5D|$iu|2PBZkqHQ>bNK_6i#y2BNoX&jPAGLP-1f! zeF^v)`1OMX0xl{`?L!}6xw)IJoF}ORxR}PJ$wpx4h=;JR`<66E#q%_br!_h8Z+na` zDi5vmn%?!=s4(9!qEwvoDa*1%o`}k42z;qGoM)p?=94zfPSN2*R!@U@cDT~?u2T12 zHE$2Mq^Y1R60`kCOB3U=z2+xl4XF_m_ih6#48 z^+xz!{hn~%@jU4iS|6dleL@EV;l5h#Ssvx=_ad#ReA2hIkj*aw3GAVCLj|OVp%9I~ zsBKRoJ3!BAF%$89#BeRvVgH0Dy#pZDdWj#{a^%M0&bmm@UaaYr_RWS!JJd9!hW_hm zSmc5aT75#}?r9{Gb1bJuw)e;ld&n+KM0Td=a?KY4AOHPvOSXL&a-kQD#uSo5DFv%a zN3gsw^kAm!OSLcrN#TCN1m@r0)JY!Mqxm*vPId?7p`;p)sYxoJ=|E^IHRGcxzpMD( zlHP>xgKXU+e}v12A^(Yye38IC2|Q-;@0z@s{Dm~{I0-jB>B!ItVvJ>vk)ss5>TTt zv1+KJD|uZD4zQWjN8~=GynD#A_`bkDs1-zUjFA)S_$gANI_zPQ_+9aq`cBAg$4IWV z8sQan6itc{`AmZlc@Juery^!;d3#J@QqMOrokkrlRd`y-nwWln_*gfLS2>P@3X1S4 zqA|T?{vDHIYFRsrCR+#JSIs&LN4U%VFcyQR2@B5Aay7$6^2cA+6Cw+pyT?MdUu6(j zLD03&EI^EkW_R|48$CrXA5Md>1Am(T+1)M*LAU)t2LjMm%3EY~may^J>mbi?VzTK9 z+)T4&-EV}%k2df;)0oEhWyXrD?Iy|)0#Vd*=acNVC~TzwnK94j>b>R(f>B}PD_8{R zs3|CiSl=LrZl{q^W3F}Id!4DxC(9N@nI$j^7(I{if;8V2sh5pgnzT9-W;=zRf3~Hn zh&Mn+1K;zkb8D@cT&!^sQS+YRj&1btNd)1m(8xmRyI#k0YE@%fAGP35BEzAE^aiJS z#OMaIE`>$Q6_+IZqUR@_gEv9lGvhB#*`qwiH4M8GBJ{e$?sFP^c3ou|zJ*`1Bd$uG zmGiykxkiVX7M1Kq#uK(Q(fjm_d`|MrT!kB+C1+(UM1M~Gb1i>XT~pMs3L}6TLH4Sq<7;(KgqfswXUN) z>K!lyX|E9`&+SZJgS-PxkX0akB69h^KkUweM z$`#y!Bpa<6_EN>;D+*MJEkg#caCN31gpg+^@IV|$9{4$sp@C-a9KU_ ze*gNs*L<#rPBi67Z2pa2&CUUP<^D&NOokQ)Zk%1os;94{d^W;ZxYk8Q@V$WVLiF`1`Y7id*u?dhqPzFzxjhOXAmpv zn#DGEEWIN*(jmagOljQN6`kLAEx+aLJUI0a5*K2F4-$$WEekOhls4YGIN(=OwK2D4u;lC{6~)Pc zClOmJkYeh}6Hd!|uI+BEB%E$NZJjYINP#D-UdVusv5}l{punK~sngb82__@T8*Zxf zoL$iHvnk)f2cN~48@APFMP=;JF6>i68MOoDwWxDb5Y!MlI%~6lc3hJr28M8o6&bnM zryQQQo@Y`qvEe5Isy^~yN^&_Gvdu69@fQ@*K&N!y-(o| zhG<7-CcScwcq_+=Pt;zJ#+?!iZ0M<^12Ax8qsl5z35kTZx8KBPznE*hUH~pv)?%7( zZa*QKx@V+-(HmbwD)sh-j5k)9bv4S)dh>wuM94IQ!l$&S=-MH zGiTMP^QV*KN8I(d&1ILRZ$`T7#7MwOr_AxETt0;wgPq=H@CaoP`bd}Zr}~8r_p_oA zD#t^Ns&9oW0;vnjzS+?#3Y!&_sP3@%YR@QV zWQsP>K1~(wqfI)J*v2*YlSA3fpDR3t()&_)%p7#h%>^a%esj!p2udaAipPp2gi;Td zJzxaFq&m%fi2sgI|IOAa2_af$ONJOCX%;4}@4{uWGZCu;IUzMkD&DOjea)I$SbQ}- zr&v--dGcFo?(Br~cu1{|R)H3Z6|#3=!{oaY;kzRi(-15-+=5uHo_W3Wjva>y<96J- zfxT-qUl2d!!MUToj84hF7&ER<>e5@Y`*Lx#Vy8edAaUpme7`tu4a(Mv((QSD1R9<5 zoM@x@K&y2Yn5MS-?elQVqo*3(W6R#B<3cv51(*&IC)<#)CY@1aR=be{WiMNBIT^0? zCz+5Y>u&8<_x!fTsz?$7IFNC?%Er0ZB+pP91hMiYofE|B#EOaXYz1!&PB|}a;C!!& zo&>ZfU_#LvD8BXR_M{e0GWfzlMI6I7>(1!ENIQN#c|nV+@^Z#iR9EDC6}t;pHX-@F zYNYVEwkteeS-B!7`VPhH)vJb^01vSI&LCA^hup;E?jvG12=Y%sAq2naY(lY3_=C(^?z)U+= zdx&`U_|861z&VV!t#pO+(i{Pf*hDKMj-9~WOgrN6;xTr=57ywx9``m*Ic8YSbXa!2 zW{fXAmsz#}o1i2+7CT?;>5U~?ns-#7yApLK()>6T^Ry{8Ar(3Jg$)gpmnO;X8OF`S zA-y>+S5?HZ@z{64i)K|b_u$y6i+4ya*ya6w(JFn8Bi|3pU?TK#?N1ZMuGmzB+vGCJ zN`f5q+r%&(Z%05cRy*q>+p^fyEvjo^1H_(zN|7M<-aF=HeP?(WVl+G z?z(>l?WX}h*wH#&H+^HI$hrhs{PS7u}X5)_odymlfB+~oo zvC5>REyru>0@laSQSVRhYACy#~E2iG04IQ9o}VjSMo;dGVgU{63e4U3oT) zZnDoMyF)V`LXhr+y@vJO;%}t}$=m4ePSO^>IrYx5VTd2%6ifOOuhyzttPXc777n}; zh7kQkh4z{sL2LHt>%)RnKO}R|P-w-ZKAUw7J)wZ>CKuI$MBHbm+mG$+8+R6b2+XN` z5aY`NLV0L%T1ed0*+S~u;#|g4taj6`8;nN*`?!aKJ831TJW#<>!C1lOid&B7qpl6X zzFFmKxcu7@(T%qes?oev+xX)623xKMMgHwwn2l3YKDh@1)a)2dXb%v|5PuJ3IQQWt7N@eH#0TO`EyRz9b_`_SlT@!JgTsQdbgdSPa%a|dX9Ys0z2&due_uMnEH zV`SpsSuk))Xep>C$P@bKNnZ!@e(Q5Al^myym^Mlzrceuv8yk;TN_{(STIl4_!$4&# z0<-OAEP>@^!KY70<|`K8LOH}f)J10uBXxMa#++>~WgjesCv&Q*%Ivx9o;^jN42TuO zL_4kuzq;}w=SYXtRjR>rLGZFz48IoJuEf=Yj_{LMySn+7RxQFPFy28zLeVk25z?F% zoWX9{fQyaTJ$R>tRjy4T^@5yNg{cJRB)a8;UakQC-0A0sO%CPF%dfB8i1uf+ntY=8 z2mueS@$a6_=FD4T$U@pa|6WtdG0RARwS~lcSGMZhbH;r$!sW+C&>j(nqD(-F+TOVl zu6YRw*M0-jEPs1{q0txdA;o_trEec$H>#?Jj$|deoccY1Z9@N%cvqcW6ml2s6ZKsv zt#D%7unOiSa4T07Qcl&{z=v<|R|@Vw^a=~4`t@&OBg@ia(_4Me*!!!Jm&pEaCXA4(3yExzJK!Sdj?kd#h12EVUs;IdX4xy z{!fS2F63o#*^QQh&4))gs2Bk?6e{w@M_2DZmc-`6Am4cGJT<;rT-3{W8^$;Pt~m0` z0>(|6VkNz&k*kf07g%{?7N=WX*A!It691z8{hq7Sbq3LL*}4SoWcw}i$>nEQEt2;` z*W+9U-LWprc(XO!O(}I>kD)`-0gz8R9gL za{%vz!*`Uy+!y%l!4vc4Jgq#d`^PYA`fp$lPU8&r=&>K+%&W{xxZgMBL{Mw2RVHR# z`R>pez_9wveCf{wPHp7nybinpgqT0E>$&H=>gK!`R)Q<28++MNW!``?eWGb?0e28a zNj(umh1EE|PQ^?|!`ajK-Q5T(-AcRT`hJi)@H+e66XQ6kn2|&V-TFMzqlCr}>|#(W zyhK@d@k`Jd0%GyBb_$PtQkIFau>?UU&lpL?L4ch7iE_PeoGG?mNY;0rtS>|OF_UNUQZw-mjb3-qrlS?DCZ2ly8{fi% zk+lbOyMvzxBU9SW9DP4goOsRptc~PgCnC*mJGf@0kll+rdN}MfZANAPTKbnKUE9j; zEc)^vom!5B`M`j$Cu^dWd2P1odjo~$*GVAKdXj*0z`VGufp?2cd~Hy7JWp7EQZp_? zDCTyR@a=0kBqvNY`tYMeO#yQZ(P4QfZ7u$%tFpo1W2!8zT88AE4ydxBQ?g+zI8 za#;&#f^R12L4!}aZdbFY_%%Zz`*z3kv$<>87BoGKL_@ec%&UPo#h-SR{n}21opOUh06=C<)`!gSr2x^FApd_70pi25G^HmliHn z*XZSPggsyT%dp1JIzEiwoSzd_lZ%j?9IaQ^Ylsc-=$l5u%i#*}IOpCu?ujKrk#~s1 zL%oUFGSs5)v>Ub5S!j#reOGSa6+qVPN99cYVAnY+ zjb}B$QI529;)*VVVZ%5~QS&?vMrr1f&rJ6r@8@5Jf2|X+%0Dr33*9 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 F{{t=7?i>IB literal 0 HcmV?d00001 diff --git a/code/a93sait.pdf b/code/a93sait.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ba9ebe968c4d2cc4b42d4c583780269f16160e96 GIT binary patch literal 121135 zcma&NbFk-7x95HAKDKS!w$0zMZQHhO+qP}nHoE($r~8>(x8AqzRL%UAWUs96+DLZt z$zCB-6cwjqqGyF68^4J!f?*?MB(yiOg5l+5kTtb4cd;O3|68KWAZ}^nV(LW5AZ}ym zVk&BCY;R)9&ky75;$&)Q3*(U!t3BPQwupx>`lq%t)`^-kp5#)t$Y(tuMdC zIkVIiB-EarY*0(EYAB>X|GLfz%kuvH^*U}}KQC}m-k_K$7U}7T@p;Nxcg;Cs9Es5N2?V~!L1H(&RJ(LWtc>JEepQr!3B>!AYQ%y;B-kyJVNACb%40j1)aP_p^ zzjt+h%~CmBsx^wH`3+%R;AqPecg*g#`{1+txq4YPJ7s0CJbN04_3HYX)qSDn7ImX+ zVf%Qb`oRS+yBUmwpq?MF6t`2#J`({Yu_H#o>~-Che|Xv0i!mhkkSZh$He{ zzelA<#v=7o9THZ8_=DOF*=&+Hq-csEv)mlY*P)%O>FrQS-H{{u;RJVr?UQCrDr1lW z`sgp@iUII(cl0~kb@9VK)=CbLPeu=P8M_i8Jrl*qEkSa{;yrwXlV;3;FdZ~qf1N+t zuez6atgV4R$sE@gv1X6NSXjEwHea3d76|F>;v2IiC_lQYEi5pYL2 zs00S+h#pbaz~SBxUq2APP#DBfVvGppw=E^{{h)_vc25C|{b@%N<3F1*#l;zY)bfK)r=g!HDGIfLiZ$i@%zgaxS*?h}lQJ$T6`;rj$djS}VNwr%QN-zu`Z93f@u14r8fgSaarLrp}G0T)V zarOrDeHi~KGyJp$^fC4V4*B^Q9XWo>b8#c5>Y=U&OB??#w?a;j0C6^XC-XI}a!X)m zR#{7=QLt4|{2vioS6E_bvIC)Zpb2UgNEwiZc84pxRSqOco07xi+3K+*`X-g{KFQsuQ$)tFhCr*XF&F(aT zsv9qTHy#a(EP+DAue(qlD+QbznB2ISwS3?wQOjw~RdyH?YU`$A5io|?$pvaZDs0`9 zvVu~Q>#(}>54H_f=-6diWq0BVnuAP62SC!ZI&&gz`;!kc$LMmCM!mL}SrIy33Aphx6Br1fde_jSaUVv1kK zv1YU_`ES~PL=wKiqu`k+B62chd=kFxAh;OVhTPaNZ!9kZ z%qz$JHawBh8Np*GV4aagplzEU?PVF^kRQCa1;sCU?74DGwmL>Jri+H0)L6i6h}AKu%|6xYoojsyL?Xm z5=;m5b+8)H_|^hjoeTOqik1F-Z4s-0kRi1CMd;2qEwr0l z&+)-=4Q_d(RWW{=3R==(hOOn6k7It420nHXi*v%~gm@{jEa>zZAZ7c&*qLdK+>TGM zg$*_JRI8#h&Z2#dR%W0`24`cBaMFs0Dm_Oul7tIwXNAh$_@jVq6Yt3WWWaQOjICrC z>jrC#g#ql@;$V($+b4nWnf$2?+#CTSYOJ>Rm1Y;x|NdvutDuPN>d*3;%8->C85xm< zov5Frgy;4>nrvTp1CJk`!iAWRQ$)rZuLH$b8Z~sy512t2m&L1o6J1Tt1Qex->(i++!ake$=2gNPv*SjP zo7Q$1BP``?>SLao-P{2rn}UXOM?v7Vw-$kmM}?+%u<9-+>VY-^HM0h@4G;}E%(wU4 zkxmhw=UVxyFOR+;<{37nQXiVBO2?;78fAr88Rz|QR#}L&>38u}3G1k#v}RFBJ@nl# znw%&{2NbJueA`K+>ph?1!VsJhU-CvTV{9lsvPY&hXyW4xzxKN>DO7ZY6iiz+G|az? zk(OEC@2|l$oP)c`xz^$Mx+*>`E>dj-^(yN?Uj=4lIZLPR6l#Gw6~}|G@m^XZyK8O- zgNGwrEv)QnFGA&6yJ8XQosu%{)Vw zFo%V|H%($9WK`-i!p91&UGRQa)y#;^K7ky}JUvaTJ7yU`QIx^O+cpBSd=h1I4byOEI8{RM#s(Nh2Ke!b}RVhp;@ndh|L#IfC#pmTwZr^puAwF z%|(JE^)C>dA1Y~jH&2X)V~%^4S3`brnlgd>mUzm`p>>doO7B{Dv@_u#R+ohmTG)^a zRG;#EsT>Tlo@}Aq#AaiSdzQ*!9tneFi*0jicFo>g*bA~i&08H&-7po?f4z#TVR22q z?Q*4O$0Dg8S}`;yw#ZFGe0xav1saaO3PI|MvSg1-J5}#Hv_6n_CJ`Co3LzS8nPBw9 zhQbCB3LKK^(q-a&{#)*Lg!BtnJ-iF`?TJDi=$ZDDv~kwwF*Liq97eoCPvq>R^*)SInul`$d~1ZLqOA{u=$^@Pi`1{IE1=*3`SpN<;*)c(Hm zn`VQ-cyMDLahM%il)tUF#Mu+61|}eFR#a=Mb<(o-CtEzxp4iL}LpaEGfiWr*nH+~q zq8lJ3 zv@x@&Zm-Py4^La46p_VZXXX-=b-@^Nw2d@Wdl%$6;VRBj&JG+#lsBEjdU*_&<+_(z zrnii^mCv#?yMUSWZ(wmg9$i-!18|MP5UML%s=x< z7sw>7v_SB#E9@?17c@J^5hNqVfUTc zC-<}5_8MGz3oxVzPq&-iQsIN7S;si#<55vn6|at_v%@{IaBM8Nzkal7VF3@03QXu; z#CAZ>4^LB_2z+!e|E&G$B>MH+e2o}ndr9MNY8g4IbqN{i&-(D_?WDlLzCX}FK=qQT zoymWp$ltwx`0@{0{%u*98JS@ItBjeE>wmxvGZW+g3*O{vYuTTSA^D{Te?km06aqz_ z`5NTgPzd4@1{lLO2JZ4I=A?z`;Wv{?G(BCb?5gdm@#Q3j3L<1-y(#IQ|5SUPc10aq zPy8zdIbjId3SQq`NPmci7YYi#x8mp^JWs zHYWP|?ugi1SZcrixt;ksL${b%RTaTWD&O9Zm!p&um6`<7MN^;!p9Nmc>& z+OEz&x74#k6;Vdr0avR)N!Q>}ys&FzBbSz%JW@d)y_s1fhO{HwuKJakXK8X0XU599V=xS?m9G2)sIwH)hT!5qhS={U@LNZ}J|^q( z2KFnOxglw5Hu@m|!B^5+kbak+kX!(f^7mK$RVR+bYgN8U3+Cl-Mg;{zwoVku-z$+{ z7|s5P-g(O#gIW!&*6jh0>z00_g^`+knq}V>w#n*-W*UO6Cmu%EgO=Fpm9AAkJsRq% zQQ2ZeuCWge#>l3iTE^&^=;XIe7v7eg=1K{=8Z%?N3WKpF9s2gq)dwQx|F5)AxT_BkL^NQtlIh6}L_ex+!9H#OzwH>TtM5lq72+5gI zq;QLN9FG(vDAMSEUZwzt(K)Xx4Z$cU%NgVPV*S3ns+#V#evVT~Kq zCAOA^Qb6~@_P)iS>e?>$DwGgv4hqLz8}-}gm_wnOa%nmaHGyGWjl}ikh_zG2!bNc7 zo2jula&)rpf6zQ$HxosgxdPf_unw>DB!?C(m7(qzU9@b;swK=^L%mB9p`G0wUc@?& zTXWzi5=DVkPHOu;0^v!`q)6<0j`X=pTYd3ezSpzM$rmbgZNy(UEv3UeKIvC@uF#Bk z)IH6&YXcXgpdxuiD2|xKT7vQ&J?=onN{7!cZHjv|HrH808g+_-rWN*lTb^R-QoOm? z;jJa!p=y|%-=Batb0cImUZlP+_qk^(pm#Uz3kJKkxo=vYcGy+3h3 z&3m_E8VHV;Z+TcZFHZMa=XSmMSWLvbrOjv}4`E`Mk=P`~Y#VdARZluXXIeLrPjDWN zoP?!tf5K5bhx3%BvkSAIFmOQRtf0|gmSm?gzHVWalOZ;%%*$J?DnN!5MTQp5y_Iw$ zq{Kz%;3pF(x^!!gC&47oN1w;;7A@ENZ(KIGiTu=W?QWe~#fq>_*Jd=;fnu*7%Oc9a z?LmaLTO&F&fGm?|&Z4TyWpbrP@gxQfG2w$w(D5rOZB~#kd1girQn+TQAprWbdoXmy znL~M^a11Y(v^?`|8RW5v05TcnvYyPkm9uOvuM@HGO>prM7|uTCXd#9NXw%G^TCN$_ z>a5BT+T|FAT`AiQ6BZb5T8Opv-ys6H2TW=R8pF;VE7=c>C5h|7SuCIg29uQ@8!Wn3 z2_TQj3&+MDvCe?Cye|TqEzQZ(-R|H4TpzV|b93?6p-6on=5pwMeRt>2##61?eJ&0; z|JW&RaH=uq#MLk@&`FcwY(JWMBpA3*Zr~*lKZYVqh6`(DxL|`FycL{%Kp~c*p$U=& z%_2(~$8O00sXL|HVL~h%kA&3KprFGDmm<^xMgL(mFWew#b{eS2Du|9LnV85iP;VAa zORI@nC#{{e@(8Y*#g7R)Fyy0Hy||>ZgE2NQ|0(+-_jF!Zp{DUwTlz z23ES|6;{SbhLo4A=VZ9k?2rP$r@jk&yV>syn1ypoY{MmwBfot~0(M1~=#-fu7Wp$6QFLYZE*!_=9rSTs%)A^G3FR+|6d@Y_v2jwvq7U zS#J6)WT3jt)zmtkx@xGZW|||Cv%>iyby`0lB0)lo3wK-30u5d!zh8e|{Hrt~sn$8a8j%1yiCg;G`!P%1QTLA5gdM14m7M7yed&0-43cG997DKd$&#Xr z_}GTkQnNg>D>)ef$#y}W9T+8r1-OCpW2KrK9M$q|`k@>ivZ4XwNEb*g;RypaF(FVP z!ua|%l4jg7573gK9!Rx=V3y!o4q`JIyqI5Dy>IN4>p}%8 z8~?;zCZhNXij+cw_+ z6}UvFH*BvOpowl%NwuID;adR?f`IpI0VEFTEZNXPumRjPc?q;oU9t(V1GZ#Ts=)o*I- z4teIjk{;2ciPy=%n5P;L`3zu=0(R(t>Qs5$H|n8le%+1zJ-D1bPQbo0MsVc57ern!@zQ{%I0p^;K)rPAC9{t8_krMFosHRIH z@@(`yipE|=3dr-6@tR^!X_(2g>U&OSE@_q1$hX%9x!I0bU8aqk4QY`FkDOiB#taxw zv6y?snnxFhW|P;V{vj%Q&5J73uO+j--F%pB?U-iKE^DCGMA=i$7cop7wfJp1zC9y) z2XG)(&DIn0(B#{nBPj)8JojmszD(}!s&e;^fNV0?W1@4KG4(dfKRa&BVHHhq6bRU>%M!GTPFTa0k@|(3kG3*$XqSdBhiDPt2+O~+Ka4Uh+vvaHGuPmeGCx_` z7^XyfT#SQL1ueHXIGmB|DQG@2M8kKYMQ15dnWDZ*fsZ+VJfA3UHPh+!+h6Im7NgNv zgKl{(eVeABW@CfnBMxzpn9fF@p@mn2|q$0>Gx-)a+YnZnoAc` zoPkbjpnWYS*j>5>p`?q4UuWf{N3bhk4&G-4rvk1xGgSBI58DsnY(1wXU-soMl?Yn5 z{oh{Gzu>-0&HnW7>VLt0e?uBhUH(I}|3A3>Zy@^*y0J2G{WrR?F#k_vxTF+njmDnMQPlEjTcA*Jk|TrzKn1v`>*eRWB5|~~ zWZkF1M2H!e+b9N`&=Pqx~8YiVb)5J@}n!S57mo_-thIM|+Z2Pw- zRv1y_vcc7FTNTDC!E9{rJvnjhE-){_Xn$L+n`|gL zI>5i^LpwsQ1J#nhsSv2iWHP`$tTM9R7t}#NXEcbV8VtYUI=PZSzh{0lu zH)r2zE4p4k&(fQrY%)TTFoXANs^j)c$dugE2Bl%dn|KY3h%_mb;t9mbF(RexFgmXx z8zses`|^7_?Z)DZJ=np$v$ylJEUVQeEw!q;br>P_3kf?rJK@H98}O)>nJ>y6iAo}+ zKaV>0n*t+!k5H#gTIF7x)_VbQJZPO7)L7vqto97SZTgep$0e#}5yZ%6rga>7RYFzi z1sI`TUqX~9=Ov<30fnJj$GnQ)kGYHPbHH*pZyQ+BH(o*1krTdhd+`y5b=985P&zTJH{&)} zOB$Xw;~HCm+B{g34pAo8A=)7OD>0r~VL7KzsJ2UdK!D{+6+#0$WLmEJ8@#Y1UjXt+ z9keaE_GiK(ih=iOlMdG!DyuF>kEG!jOy66tpgh2r$fQ8qRqaGq>QLbafIeC5V$(F> zFCN}JCl(D?U(71)cTPGf3lmsuENi658@@W4{!HVCE0-Z9)XalnE^t37SfiA0)^<%b zBlDq87)vSHq!Gf}B|rGe1qmtor9=p%Hy7$%rz^`uJR@VUJV;u4!cZ$l+giF>luCyq z;ahspEujIG$yVcoQOF^2Q!m3ZH|g)P33j8+j6@FWb@fDK7~p1T-7DDL*E7+b#Uk$ zV`dGj84+~>T`vAj`)b5e=~P9jOHLKb8o!+Rtur=vmBsRc`lW91E+Y7bL4j*|2qLAj z+DBDo_}&Io;RS~-$dRTbf%K&k809Iv@v?2r5AZCu-Uh>(3TPPPM0dF%c~s?8aq<8a z{DC~585zRGi|z%ChOriKq*768u=g)8+H-d;I9x?Dh!kol0XAFf<#LE|7<%3Ymb!TZE9s^T@5nZh5k*4NtX^6 zW0oq~%xfP68Qy9L+D39;YbvNZWt;Z)l&~MGE|@35mhw%1oJ1xq(50_$nu~x<*%mbE zRAZ%BlE_v>e_#%$M17bs0~5g-=WHCc)`i8xz$p!I!{e$|kW9Dp`qWu5N$C7^I*dR) zqa#%7rQ5x+cRgNVpz_QTj5eq#K%;NyeK%Z{EeEt+7RbA|5%SDz!Q^a)igG1gYuZgz z`hfT3N(pJ6;QR-6#`u6>jh z>5EE}QBBdV$qRT!%tlKr5SCX5ZbdBrg2f|?74}c#xv`qwF)IA!e%El?xyRRci6^%zeV81BYFHtKnQc|XO&$^g>ljU3Pn$p75Xzgm z?6HB$f@@M3S9v!Z7my@gPXF7-Nn3MCRqB+`BH8$)8|DGK5cMEkJ8-2wK$_#+5kB6e z?B|MD1j-heU&DJ|g7oDXsi$;Z`48CN!|$`{5ck=Simk->g@0Q2cG}g(Ls@ zDXnQnQ=VakKtVe}+*QfD{=_2$(=G;%ur19wJ3&xG%=X^S=L>HiCDkj-#!+_lbM$b* zdgl*%{}p=)Ek7Q8O(Qb8a?N@BRlEHxvfZ+_rF2imCSB(~vt(=_NAR|;SZ?eJ$tr3? zVI@NOHs_6eI3y$0m9&hTA9Af$nJ$9Dj@uWdl+?Y`0q?kDHc?O|w!Q#?p&5y3G;}BdQ1)My45DmH>JpQF4t5KDmNP_$%op*DeCnuwf z@>5W#a{d8LJtyt`Jz>apX1+TUZa;B;2e81w(S7`yTB8rty$smM+}*);i^_`|O_tyR z)t8Mu*2}xYb;JpO2gV*NU$SX_IffTcN(HQf@oV<6Qgy!mogqcE$^~`o_ zy8UI_Vz;L~Yi-+1g2AhbEL&!cJ2|zLMz1e;#hhYiSfQQLD#q#)&Tb-FF5$4aUm)2Q z3pl|=2xfMIN&TP(?L**q-MvP2_g~Wp3*~Ju+yx7*Y2>`O7?mZnLnn_UMwCiCW~PFy zlvRUuq*Y>B3-O^k_MX8ScpVtMi!+N2lyq#Od~6Y2iI3SOv|2UOSOJ9+b?WR zHM=>jeJ=<;FXZ~q-euPrBY15N$<~3ri%uKE!h6g3n5(qm|#?*KBtYE-!XeGF$UZYUQ)$KwJ{AXuq)dKDgMZ^Fv zT+%}c9NKYJ`H$1ImT^*E?3?QcBm%&JWsALuf@-lu@y^PmL)rPxQ7No9;b-HuZII2T z*D;TlTeKY~XetUz+&f|X?`e?uNX}ofzl7zoH+BnKpPMS%S06qK`;Cty6l(NQ_*A=U z!YU!R*iPe|>rVp`a0dYgVsLQMLQ|-wtL#7_Bt*UO4EMw4#R3hTI z867W{IzWpI^0T5n;yg=;?v8 zX}#0=@{qbclUIspQo+fQNR;eqPKwWd`czWsX;IPER<5t=oMxpTvrG_~j3L;zBM=8I z1FLbTwx#BeUb3N-S16^kt<=*r7-RK4MHMTA>rNXJB9=z|1{;Z- zaaxlicgp;$ZeIgk!1KXA8sBcI_;anM_o`XGO(Y@?cRG(Wz=BsTXMJ8vDq|@ObF&q@bDid^;K*u7&L* zvezX(QOOZffV@d`O5&H&&38AciXhDrPjl-Y3E$A9$fI%-mQ$&HyWzz8nwrrCFosQ- zKDW4Z8T3c4``vt)6|U;PGE&)fyyYIQ-AxCRAbcN(HU-1r*4!_Oku^5&kg-xW;rtwl zZa*H=zvl?|bU{-(gCPuDg+`eq5rp7Ql)pYSMucjpPd|sppG7|ZinvN0s5QW1mlvkV z0$icW6V<=2*8Oer3(;D~rRr7t)YUkA=US4otD^lY`4L0xW%E(PYL|o>f{dQG|290% z(l+QGAca{=eeI=;`;CeDlG9rxyn zq*$4Y8{?QVcz0cAjcD%??{}t!2T-qNSLo_Tuyn-`F=F~&){q2RWaHq^a5d|dwyLUQ zSq(KA&+0BuC2!SoFuj#6415IvNpAQ$%2KB$CIzW(h1)v2w-)P z;j+9>p#2POBy7lfbTsViUt0voLf14=`q7{jSi+jLTN2 zkl)8Dve-NnOCGd%Tc^yasgdnL7W{rZ^(aXX{zK#c{l47Y|GWJADf@m8kD=f5=eWD& z*KzdcG+c;;srz7OL*pI=-v8&}uKfO~xINw9 zKV8pH_>VFCpW9sm{fi$e3@T;K@jG#q&RI*c@p^g|C%I?Wr_0^KHv})BQ9eGwV+orC zos4pm&yf(4<(UMsDmwl}z#v&}FA~yu5KtCgeEAju2E4{86xf7Q6a-uXS1zn!0bzdM zk$;U(xC(!tc)XoyZ=#@JK68Hj;y+mh1(#Jk|0y_@{dK{dFJZ_~PyiMEog%9LAZ!d} z!R$Lo^8;~V<=CePxagS5yf)rVD_n4(JofXi1}h1{Uq!*^mZ7h#@%KbDey<{i1iV;c z`$Zs2QerRnkD*1%r7<7Yb~@ZhV!}ke14&fiNE={@qKF^jZ2`qfqMH}+jL3w9i9h~h zsqvR6f`TZ%-e05yVQ>1x`{%QI|Idfk?>|21{r~aVa;FhSN|;!3CyfdaRqrEF0t;SD zy|+LG#?kr}C;HdY_0Mu*Db+1zXMF}4`sW;HaPfp0f3~e>v85P(sUtcpPXQ&OSSl6O z@sTx%GfNgKc3~0f$YM$=i_;TZ2v@GOT-@1MePl7`MfKT+{eTj?wnCXNk}$3;KXV3F zfh3|BE954(@}H|GdXvCs1UOTcUry=`^tc3)MDpCTV@{qpqC_(E<+nA}U)9Ztw|`-< z*}I+G|D$?-(0cysZ#-E84D(_ed0HR%>|^^06Bsns3#Ei1n7bwegMQ15NiTtK_D;CkCVW-%@be?Rs4Y1 zDNx0~Hn9JX4cLP4pIZQu2tH-(BPl4 z-xW~u1VT=QEC}EQg8o|vLIjtQ|6NV~1jzZdfZ{;jUz^hke_-r;5(IQ1xsG2TzohPd zT@(0yRNwanl6)NNU6)J}PDi0rW(HqBD|r1>$4DYb)^})2&M{B$c_B67J`V+KA}(!X zCosv6FXEH*$~FH2SfsF6YFeH}2Vld~$Q-qA^U=$&oc9nwsGRwM}rUCXeJND-(??sJ`eQ>pTNw>j& zN;96nzdcv6+>wQAya>2(fTQxfSE-4b>9YDl|4nZW+_16mLHB%tNCIIaS+hpNNWh|x zfAmFGtfe9d^(E8$`DS+GxBZp$?S|C)^|{T?!S-nO&|F%anf!~cgn{BLnJCoXpdM%I zgqJ@&p$j0m8wI1^yilETjX|N$9ZTahfiaGKpdj#xy;0m5Q*W!qM?qDyh-dU%uCRGR zX`GGw0<=^o#Dz)o;qm1e*h>WWV(}RMytsV`=8|HnLz(PkBd;+Y2nUEb~d{R zS|e$_$v&xHBKbQC+ZPYZzlgFfc94p>WOqg13apd zPhAeJSxD|HlFb3QPoD|Wzp~)9hOE+8g7dKFT#%5>yH;9oTjn=Az=6gv=X6-3=R?K0 zg3l;xQuuw}QoNNGIQd21sKqs>m`z=~-u8FloHy>d{af+l{lKZSCBKQ5!cU7tX}C0v zE)LVPY1uzp{tcx$=xgkLTRVB8!(t(34AINrTy(3ZC7$i}v<0^HoUV-7C?*2&% zJkszrkD2`$5}77mH2RPv-?CzH$j^|@Sx{Rv-uZnn@ePDjj`J=^RQ zWLNhyO``B-hmA-dq(Y)hR;~b1v-2k+WjRl}oXnM>)6+!t19L#}&l?X~rJ;Hq&XVLv z0Z{X~8Mg#fG~L<5AZIb(t_>Ut=OY!(VD|2HHAlcL$VX zZ&aKuJn8P7BV(lD#*XwR7&rRs&Vka&E$*Pbk8kjiZsSX1jjF#ZN|xIBabLJ+G6hE7 zD;?<%xj1>7W|{b8D@s1w9@(UxY}%g_0uE@6S;P&ZN_TsRn{DP=wlD{fL`&n_ZL)n9 za0pky6`dCHedH=+aYJp^u7(_EP z>g-45B(W_hmC@3_FO46~ynE(TTsT5bf3=db=%CMZrgYAZ0z7VTuSoc9NsJ?#1{14& zQ#3Z64zDfILG$w+!Q?f6k}TTRHBF*X;jvT+9_TVn z)*Zzxw%imo-ALlf8;oIj#G)JTu9Q8Vf2W&RHe*)XP};E3jZq6YRDfftc&ueGohTj} zG8#`%GcSxE!Fj67qaTb;^5TXH(W9$_b#iWM&2bS7Pp>aYdZ{r4%N%c%p)7L>stC!4 z?MDF#uV6GCWzboILd&G=wP6Y2f3}HB=TFm6l&+huovzHXB2;F!4odQn{e};2-&->9 zWH@H_yr!dDXWg0BiDx6)RG6MVDt&pz$bx@|3Rw*KN>X1~SHjb=1Q-KcYzT}@E8}c? zP_x$?NhZVC@TLvN9Tyv4h|a`DmvHT;w^ePBUMsQF0{qk(tRh8*lS-)chRNTZX&5Uu zN(8{rrr*o-RB0KyZ`5cZVaGZuG`0J-Z-Sy`MQXq*G%0l}H1#6%hLMM^GPc{9 zeoT86es+ZMHFq>EG?dY(4JTzcor7Sf?YaBQS!jBB>9Nt;je*-yX79*o2gs=%|2KNvo5gq}ZI=X7wb6ngk`)zKrSos!lR(^;ByL^}DVz zk>}#+{NW_r`_J1jqeNZ^pA;F6Le*qbru>wN){eJY8Dy4 zT4Kbjo*s9pp=VNQ>VlIqzEWn3wT!Tm6;U<4YGX{T)EQSL7l%r%vZD=#^HG4mv{ZPh}nEmltC@CYU3uwokl&eM_EgHq+_8#v))nFv~Ji~B#X!HLk5s`q$+Y91ee!@ncf5v z-D31%j35?Bd|pIE?)?*0PnQASpt(UTbH(?Ba;#Ls!fo!N=3&t*yzw%zRznytrkT{+ zxG}@ijTq5EibU@t*t+D;x#9vmm6i%jo|Cl0S#RLN*Qp-jHrrG#0^n9KEdFzm$(JyR zw2g_u96?hqG*d(ICTQg`>G=K%m{e1ne+i7Bz&aFmGJRm_ywD8Dd2C#;s?WI;x?enX z0U$kAiU2sPvrB&1^3L)gg|O;J#+BA_y#P=7KpM?io~yNwGe z^La()??f~SXV}|{QLrkeNh(?HlhML+dVU!JCLl?;cIA^g<$8$3w)k%V_!1nw@D6SrYc5) z-cQUg!pHGp67bc4OpfTiJ6zc_-SP1f`smsb)5+#pC4Gdj`?X?VJAs3n8!WU>V*fUc z<7k<1?$$<&1ualglzPN86mx4v1l~Cy1vOQPDmie-v&?6X;u)l50=U<&8HE zZ`xVXkbuan$Kl1m(?BYkHb9ksKhhD)l84B|Eg})7WF&T_5iFZy9JSLpu5w;fUv!3v zki{m>v1qhOiYxeP6qNL%=#2~#dHXapV8^2{Db3*dUzdyFN%&ZZ91&z4JB()U!t5}0 z%Tyk{8dD0|!Ijc?o~`8&J+h5w;@lpA0Clo-;>ut9X@hmJ(a|>5izuDUDZWSLb`?T7 zSW}X!SUt&?6FHVA=MJF}Is;H6oevr9v=cw5J$u9crda&_yD{|js0$m}U3XJNm%^62 z6J{q90PmI>HxMNep`%!c#t*4In1MFf31rUMp*WAm;w}rcV-U1}#E+POLr@W`8zY$A z(UuOYjK5guV8fuB0Tjt{SfJbGLm+nNL%{A;_qR2prS~eJ-b93l7~GTMmTr6ZiKuO7 zQC zPG_yMT+YrPhhaH}0-vP&ro4_yClKjv2u947FS_PX1>t0{-l@(<2j4-ca~v@ald*o8 zB)O28)HD*ih;c!XnK89u@pR`D>y2 z6e(ia=w<(oM2L@F8VQf|J@69HplLQ2YvMDwFrDi zY=`5BW*IpmcrdgMXTlAQhYWJENylU&HlLjmLmD45k)!<0A$7Mcn3FNfYg&azAVT*e z;2gM>uO3X~d<_04{ppo|BZR?RZT<9YB_8<&e9_zGD@Q(fIE?plA%hELH_pW2<>RFgXBhV z10q>vkrIQD%#s-06!>PoZTTdpiTJXK)2S@2-`Rvt2j>YKOgiAXz+W6|0UWF6%?Q9* z+M*u@LduVd9{J3SO2`rBRQI`(=q5h{j-_Oo$@L=&ZC+?!Bm;`knUjCKHLJQH3Vp)~ z^@nDfL<}^REN)R_BBg^lDZt%s@(RObtUT>{xSSvg#667JJvI~vCILs}P&to+K5C>h zrv;#a7VSp}Iz#{^)j>axIT6cyoYf`;yS$&!aoJx*R#P%cVzMfxe_>-yPFGbhkXs>~ z{AO-YG(bmgyq-#=p%tLhIfXo%P!tZUY&XsU=t4-~x#UNlb@)5441&J~$Qjes2{TsZ zB&LJXhwU6Ll}a|>yjerA&LKlVkXMx?)1UxxWSr<09Y4FEb|#lEyMJzok)w8^WG1xW zPD?7C$b(6PAn}iiC+JYIE1w$y6n{H~%jjIM_&5N$2f>`vdkI#E1@aW8^-b3RSOo)l z76ZCa25Ac*PQ(Rm%W|P09AQc6?N(noew#=F_#Ydx)7ydUCUjiCZhZqr_8~8Y7EHoM z*syd8ceBVnPU;_y=vHSFJgRiaf?Xn6|BYh0bAFY!S1Hlsi}Wm_Q@&&(PQGNXZ3b=F z&IALFREW|dB6I>eLZW1A4jlmeju!Cd8lCVt9T$!Hl7NbfCJ#P z8;d2-P8QD$o3W^JK6F~1oL|V_USus1$CL9iyCFvf3~1@`3a8n%)KogFDBB%*k|TA7 ztu##B+M;E-&CzcxEhTicoRm`tsI>g9`75nlkPp!H(iU(p84W;+YjL;*bqD2^a=wYk z`fF6Wc5WrU0T?vVnu1zwDBm^Tr`1*7qlbo>SY{$0Fn9dSV-xElJS>9uGOO#eNL|}m zBNmi~w@yq{M=f%8XsYpKIx)#7A0w-06rJylD7BG<)tM^B?dChU<2p=C8y51POXBS0 zqyBy1lpaJ3Xu#YN%OP`gcpPOiSp=4n@K}s>79-|vZ`s72P3RCmF6*l{^jeqfCVG_o zAmj<`HkN(DbW<@EIWn9VQWwC0f9>atmO6f3(^LGOo)o-6p zAUZvd$*+J8v>{4uNl4NfF~z4yT@y(kj8ee0UBG^mA2Fd}Z$^i9e!BNDX=pm^LeZg$ zs*e+S-3}~>iKtv-PuF;TaFg-RA$Q3`1+?R(w5Nt;yzmeOcV?WT-`wbg9AitR5hC#` zc*y+9^S&#&NCy9=VCLi!Fbn=dqDLQLyK%+o)M#RkCgk|8V|g!-+k{`xtUo^hwJ`^b zf8QK15s*JGk@Xl!@i7nRi^g99fklqYP&uNrENVS~kDx~f@HGIQD!O_<6NK?f5PY$c$7FI;&cFhg#8bQ1DyRSW{`?f4uYM?0TK zboG6#B&QSp7jbVM2xZ&8kCRZ=(q;{j?8eO4QX!GjB5P&KTFSmB3>A`+R3x-ZC3{F> zqOwORJINlB$d+a9-!)@~8Qt&GeBPh;`TpT~Xe{?J*Lj`Sxg6(ld259=vpGYrqRQ2M zUFeT`uSvJ>iVdw&>RQjP(d6ZQ98Ut*!f-s|#utZpL>Tj&H0XG>lHh-j^iTUB3F z7@%L>P4U_;r$sAlFLQ0c?^y~$CcOJn_XM^=I(JrtfYg3 zkJ`yep7$m>$_BAoV(PYs_u65$vYqW`H8|Vld}THB7Def^E$zBS%IIH#d>rF}eKF~E z$`jttI1+Vs{gBRGWATl$y=8|~E&_8U7gnylpHV-mX8MWDWn>^&pj zoN!;Y%KOw7-De)}vcvrC1f*~YC41XXWDdEr&^=E*b-qlpqH=up-rC$x{3jJsdN}&? zAFw`Y=Q9mA*l>SCm1zXZC*X$S?{8hrcY4HT-?DJE`&-8O>er+0f8yn+vkT4J{yp~E zsJxK+$yZK>T+_k3w@12Zy{hJhI`-i-*Q%dQ&AUZ}F`A z#ohU+%b1Ug!)Uj!1YK%+Oa{n4P&1lihp!gzNaFS8b`56Vw#MA~txKpBhH+*$J@z`0y@YB({oykFsAkdexrk&39TWwX0UE=}$m8xtNCMd6kVL6uTyEfGyjN4zS zt!~@!s;e`vwtc@gJs-z`V_LmzdOp&s9VUnQt16=9g>eae(2(gl83(Ny?Hu$t*GKs) zGNmhwtu8xl?n^N&7i>TJHC?r=>u(z{xDR+|nc)NZ74)IamEYPWa+(`&)@2i!ikMrZEng{v3E zyK+oOH`SY291Uo>8Fe*b;Cz>!vT)qNct!rS_~>++T-m6`@vI*C^#a4`&O`S*i{631 zVaT~bLx^p~hReb`0y#H`&^RK>Y!qV>X~fcc-Tb!w;LWu(3L-Xp&uyIhai?#;Z2W`I zhtbq@)eROjUQqAQ4l;dvKR8#PU9OmO zuZL%a7FH*q<*;bxk4jD!jlfAAr1|w0zBP1?vW@TW@vWi#fw0iqlDo%6%Ukz*`PLgw zY%42rD);Pucl@}Lu>D(`@WHMDe2SypDs|!jcVK1MCTpjV-tNl!NYjuO&I(7i{$Bdh z%ct$~+T=zecsZ)n%S}#WWmuygC#n}6s`kCK>EdD6Ht_F$6}$mFvqc~Y(%yQzzmbO70%^w7ZlS>OLPe5Jon}Hw}33`T!sC#Fr&vJ0b*!**}L5{%*L45-#YN)J$_BY`j;d z{QJUa6&@u#yTn?u{57kH$7Xv)5t<)}n2K8Y&|_MMH#w(QKVJ~`Q) zwH{j<;SFti-q|~zJ=T5pxwBDMUHyyQ9hxaJ8}0_33TbY*=eI9Rz37u}Q_DTS=fAzQ zUc6V?o*9M^Si{Q^wK9Q!`pdANQwpOGlR`qDSn@X>>$B=b$ik*oiugRW=-r0iAm)e{ zzI&%zJ{D=Rtqi&BOslljrBic+C;r8!9sQYA^1*MFn?GQ+&UtM2cGH^tDwWtOSp&jn z1z+d<^L+cg_&6M2#(qjcx~*3Zc=7J`6)S%Gdk)GGJPysj9FtGoITEORCq^bhw2T|4 zDA4kA%O`d1KF&43nD>R+2;1CORXl&=*Nz@fdi&t>%nhz7vp!PM>KzkXy7G(SciU*S zJm^qw*G@GFdF!=mgK3Y)+ilrbS?(sLU9BAB?d|jF-YVQ85q+Dh#+vaHFq-EP=U*8* zb91ETclp&amwOF}z;NaB1UfCCB|8Z03TR{cx9~+Z;-l(J_xomy{U9* z^5p~B7VG)ung>r5j${W{{>KC>^=ML}VqH$5XFd9`c+&*clb zdzh!0dd~82cou3~9VtE;604oMOi`fuHH+)j(XHrvjIIw>`tdj~2uq%M@*u zR1%*X*i}J)(*--x5Jmg&ta^t>$!vq)s0NfCJP1IJ3@*a3{SLqN}s#2o`&gd^9rw&6$e}1IPLXQin#h_tUG=-=(L?M z$S^gR^}cMm9lK%BcpK}=Eg0j8?LMr1W{eNt=GD(KX3<3aIP<*cK>H>wmHT$hhClDz za(6;o2j?l^c8_%?or=$3mkDaW_}SZO-^dTcm1~*mc{!v_GIeL4no6;TdS&f;;?J{5 zCNRyG+4C@u-xH4-KD|2WRkxylHVq~{!SFmdwPu@!R{E|4X>-NW+S@aJ-IoKdPx9EU zQIUS_;SCs#nOrH^;>xQWH9 zT$(5C1!1D;UbB;Hb3a}=xcB=2ud7eM{prpXcQ&T6@tM@^aF^lcXbX$8%_(m(&3(1W ztGv6q*1smY0{BG}vw^0pcX!o`q!^N2%yvBg#T&sfv@LqT%u4vd!}UB`q4k#0HWgXd z&a51I=`0{;a?~<^^kKqOzTOZvR*B>dRTTCWj+~U1 zly7e^yp!k2uVvM`zN2V^#>WZa35ye4S(`T74{-Dq`m3AwiskLvpcQJi>t;in{TClu zVaI%7wu^2DZ3^D#J*`-`LLyS%Q@zLR(>=L<)uP!G93@VT=g-CTN2JBv>QA3)m}pE$ zy{2B|7thi5pkd~8l6ujWgwVFzZX+%%gAqSv-8+=?rDK)>?9tfEjH+0EcyqH&eSWN*~rr-r7$xxL(Gx8_HMM)&>QA?Ia$_QgrO3^yH9tcsX) zG1*#e)%GyuqlJ3MM+=`vgR!5-)*lJk<#cub@rpd{l%zbPF3r~MxqO}Oy(z(Ot4-HT z_#dHvHojA}Lk1o0_w|%pQfYiHpPzZcz{QDmxq7e6JvA@(xGM_BeG1g|ODaVPn_VsG zyDyPdUj8GnMR6Ia_334t97D{A&?qO{c0*2AwN(+Tu>x8tBCho;w7D+tbMr8uOs(h=?590e;sbS2t~Mp|!lNeewBGv<~gV zVz*~CpN~IP6b>Fu0|C~Ls@y1Rq`i$(=?aPIxRG+7UmLh2Tst#1wbVwA-ZBx8`>ri8 z;BcZ>UA-foy(0Zq*t3B?Pk(`kUn_bUqn=A|`xdI1HmDDR_yaa!XRZ&(NnG^y8F#CLRH@(84 zXhQ>WQ?pLkL*?UB=C~inN22SmfbYy1`gAt5^ychTHD=0uXhZ5&^WPtfK4ZOS$A&OD zUr$%n4`F9phoG5OnJ-XcwSO?AYYt84@MDEsXFAPiq#~VD9dCl~o-%5i9gj`L4Bt*G zKkPqSJ5=ERtDfnjKa@1bn?vUbKj^<|zQcF_wNb{~>u~WiQ`1hE91NtD+J;HI;)%Q0 zhB+uRa=04$X4ENRdE9@`XzL{7qy+B}_GD=G{@bbOq6zbO)YTrY(dcqa`{$p#Fm^bZ zbGM%iI0n`~_aBwGRkQP8f%B&CWh%2{%J-E|EAh&7seRtJ)9KuM)mtlQm0w3{(KtB2 z8k@9^c(dhli&VAnu*%GAh?k1r#II=cngRdW=y%5~yCZWGd*!!W*rM!$XWucD#u)zW z6moj{i(fcE^m_G*!SxDi2zalLFJQxeW!V= zN|9UOZdvn~Gy3AOZ7~xwHyBn-riJWw%zQw*j61^`Q1$|Bu($ch7JEGZt@f&O)z!xiSU9gNM*D(Xz}PClrG}5MKCc(aC1je-kkE%J=`uuo4P*pmkJ? zkwcA_HRpVdv7y3c!0vMobqd7)ayjp^D~DI_b{oGB$Steiete#CNG}2W|7W~R2y_%Y zdg19a1Ztlx=BcjUTd|}E69Zp#yE>2eSA4wbJf+rcH}X}AJEJ#GL41Gr(`}+A^ieOb z5y^H$LLCkF4MqV#eq$=7yTm!7YPWBrD9<0?LZa%ame><$cVFT8d-z|8uq~xa2;8P4 z4@iAlhDs8`By!*U-z%l#OD`jE|JVskJ2*1n>zjh?X{Q9)uU{!Ucl^}rkE$DIJg#2z z_^D`CBksa4;XV@5hU?FB`kIe>QNMN1&Ip^a4DQktdIV3sl#I2FldrJ#W)HEl-Mf+9 zK4Zt_&;K0#@cNR=))((i`&_f#yDa8oK<04SwEgJsCs%G~0w&c6{m->qUYZ7H1~Lb| z&F3r2t?z9KR2GVfXQ@A@;B<6<@phh+{#P_MH|+i0*>4m8)?G$M?kf%gzbtHd+od_u z-RmC39NshjPSEul&d7x7;Lc}3k5!+J9w~YH?OD=fV$a@l*RV1o5)Up1Y!YF)`O~9q zL%=wuJUYZ@!(jEq3+wF1Q(wQIuaMD>dN_+`Yh~-V`Hwftqk3~c`Llfd_;a4u`!8IN4~VDcV--GH+sGCGC#l9 zNpshjF)QsASvnOM&1yDsaL~P|DDg1uJJuo- zn*1OyC@<$yKPFV>P~LY0o%EF#F}Fs`2F4`b|JuXv!Wfr-R905~8T!V%=Fq~X+h<*;y6exz@tU`*r2m$WUwCm|T_LSQU!xDM z%l$pP{JUx3@$WnnDbwfjmtUl)cq`iyPM^faIS0h!Q2h>mj&axeE2K|n}gq7d>rX^lK)Xv zB3In;)0Glwt`#%t`*q_58Gb*?J(7x*;!F6RGZ=lIwKuIU$G`bYtjs>_zVmFw5z>1& zi-Xq4$ne~lFpJz1y>4os-jxRz-^_B|ad+1C^gpS!{qWY2y;fUAN?F_DP}_A41S>L^tRWmj^<&r4e)9mGxbtSGnW`lWwxwq`q&&5p>?Nhs3M9dgvdV;j9 zv97i6zIY}-Gv3_)_z1(B_A5mz+VXN%Bf}=YxqSGUeOhedz%}dm>5}ekcU{?2^SQR3 zE~=1_4B7RuIQ`^{{x0D+ezpa1+mskAY_XVkdMY(UYi7U|Y=p>{`6Qc3y7CoPS3p<>&4pImmkFV9-G zy{9EoG@|lIn}dd+#_GO=!();hu@%SpUa9uyPOCJEX?L^S^HXeSIQi-Wx{3=gOY1J1 zfhy(Xl6dpx^6qfUmYZkxhh^p)IVIiA9B=gsUA&H?8Ww||YtgGrSK z&3?>PEtXZ|`IEQn>Sh(XH7er<^D1($Bwu!Qt|{)TJE)|XI`Dk6VR%9Rz4R5#ZSS)? zQePgRJH7v4bp!3SWGJ#KyJVB`L*b(*Y8ic)6WRET9`0MoP~rI5N~}3ONY7%uRcmd~ zHEU^^vY5QE^zz^$1&k!%+KnPAtoOCg=-EEAeC)j9=I@=lH?~HZ$=Mky77mIY=;&K{ zbB{)3hs1LG$jmrjC@?xDq1&UKez~(*^w=Y|ZyZfPZ$>e5@cdq=wK8MmD zxoecLRej^zz?bA&=KftU`tGgp{aX`tGU5i}r1!30ab0rYqUWKE=U{9{^@ik`Fy&>B z_Ild%`)sbbJYAO^9BBh&-%_nh4)nSm^<1lD9e9h+KGjDm%q}Eq@WBtIpr~%W^IbP2 zjnZy!*xZ~e-g)0zd1X&>ntoY|_N!On4yK;#-R+e#wR~#ReXZh8n0`#}*r4%~v+sKKXHS}&j7b>Mk0wd;J_g#T-;AEAh-yDO1U{@pwN3kV zq8eBqNqUsr%=m0-Q?BcETTEL(C+g+7{l@*$3Jy;qX_`1{ik>Hk?KX%O_t!ulkUU8D|Xten+}*>9I)=scp7u8A6X_G`*Q8(j?XsDGB!=F+iqXC z;h=e$F*NLGy2rOz`>0aRgnswub6kgRbPL#Iy?gnzeAmcH2|9xtCP%a0$?7MF`|90L zlwEDmw~X(p`0x8K0e2bbVa=3r6J>ufa5S62eld3;=v-dUG;6$a$kLIUz z9lhoH@y6w$=i^T^T->gPJ(_9ZNuECO6$(NX@{q=ENP<5omDqB|6L4;@+E6ViWQRz-h9l+yi|la)!I=}(#^NL&6A zXFZg|aZpX~EDD|QT`W=5=Ix^`_tqI4?C%M>{gxr*Hd=#i`;)UpqYs(Ze7Yv?yzk&s zowK*ke?5EuyfaGU$+8b?6YSIsu8V8!*L#{KxBtnqM*RdPhsS$Ycs?%QrG4mgpW%&% z0%(O5PjwHL>^Be@PB$>vxk1h7(aVF=`bO*7)|z)D#iZWp{!|WKyU%GRmD?hAu|1ee z_>}LVOV=-SDTG-X_J!SetEE=iid<*JLFa13k*NrhwKiyc0^@0d8+|VWK2oue=elA< zh$+T0NZRJp;LZ(#lb0$=oK%wUjb`TK*pqz(`|`ET3UIY|aEa@NW_~oc%?2OIJsLgq zJLh>*&|0OQG4FQtlO0~Pds=@T@L^is(tXx;szGJ+N}I2b=)m|?W=Y!)T>Es1IAe!J zT|K5)00XT)KQ?BLqu;Fl>xNu6cUgJs@4h^U6={(X^vA&2+!z^t;7k^!h@Mx`L@&&n z>7RDCkhb#@fzer<1pUFk)nwi6GoRz$ByT1b!Zg zP{5D2F@dWGWYobwfZypRfWNYU@K5tPpJX#}|H?DY4cw8Q5k-&`rF_OY?NN%SM9KcU z?<5L2_eRaVlPKie`%3XnA_+1(JYMNXm-t?yG9$fOVnq zYeqDpMT-Nz#lqdf-sw2$R}(FHzm2=%&Tv18s| zNouv=J=RrVB0SZ?lg!yXaS3#h2sr?Ru#z&mvT|}v-~*2ee1TM80w2ULWWg)4#8;GL znUwH&z&FXsGRYA?MJX_$h~JHpV?vRBi!As#{P&VQ0KvRT5Af&n5$v7xGF8vF@Vn=X zlJvuW{O&m`CB2MPP+|ffb4ZYAMJDh;`T_yIn3MAT|MwP=JsQChNq_s#ME-_n z8-+qJfseW8oPVRq{)`-%D)HPcE994~kZxg-MJw&tL6pk!jzh^CB52gDgy_{#L2K2e z>9*6UU*NoSHLk*7#dU=MQ8bzk$x^sNw7sh=VW=-jM_2z=c>+J1KHwK7#pt^NA! zSZTr#2P;|@&~^5=H8!%AvZkefoG|=AU#{5Od%dS;9bHyKqs!@+q7BstRo1lk#?Dw2 z`&LCkm^YAmpz0=6$PDdz21aS4gF&j&G?pAP<$p?fq2$Qy`X7+VDUu_5u8+_`EVEQc z(F?61VH4nAVR5O;BxNVP`Wm`40iAUb7S=01(?+?Bbk$6Z8isO&+`6W zzAjxKUp2SgF&V~YOUR>8*T!B>L`oeUXXRyKHA%V66lg+2Ya=cCCqyKQy2X?kGys8L+UT&Fo>Drd)g2dFFdk)!&NBb-4fTg0_x0PN| zg44AxZx`L=OWieIpS(Oh>0IgT?ML(1xd$Svek o_?qL&ePN6wlvepX3vcok3V)y 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 literal 0 HcmV?d00001 diff --git a/code/cbs.exe b/code/cbs.exe new file mode 100755 index 0000000000000000000000000000000000000000..c2bf544d8331ae94907b123157857f8ff1b5ad04 GIT binary patch literal 89088 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 literal 0 HcmV?d00001 diff --git a/code/cbs.for b/code/cbs.for new file mode 100755 index 0000000..699b79d --- /dev/null +++ b/code/cbs.for @@ -0,0 +1,6256 @@ +C Last update: 8-4-1993 ore 17:20 +C - Version 0.0 - Debbugging in progress +C Stato attuale: +C - Questa versione ha un disco e 2 sfere o roche, +C senza grafica, limb darkening non testato, senza common envelope. +C Debbugging in corso. +C ------------------------------------------------------------- +C History: +C february 1993 : performing test 8 - test 9 +C 1-3-1993 : changed omega definition to omega-q**2/2/(1+q) +C ------------------------------------------------------------- +C *********************************************************** +C +C CCCCCC BBBBBB SSSSS +C CC BB B S +C CC BBBBBB SS +C CC BB B S +C CCCCCC BBBBBB SSSSS +C +C +C C L O S E B I N A R Y S Y S T E M +C +C L I G T H C U R V E A N A L Y S I S P R O G R A M +C +C *********************************************************** +C Marcello Galli - Loretta Solmi +C *********************************************************** +C +C Version 0.0 : 14-5-1991 : writing in progress +C +C *********************************************************** +C +C Given the parameters of the bynary system, this program +C computes the light curve for given colors, accounting +C for limb darkening, gravity darkening and reflection +C effects. +C It is possible to simulate the presence of a disk around +C one component of the system. +C +C ***************************************************************** +C Units: CGS, +C For Roche model the unit distance is the distance between stars A-B +C Intensity : erg/sec/cm**2/sterad , +C F = ca/4pi T**4 * area = erg/sec/sterad +C with c*a/(4*pi)=1.8065 erg/sec/cm**2/K**4/sterad +C to shorten calculations i should use adimensional units. +C ----------------------------------------------------------------- +C Note per la messa a punto: +C - Ci sono ridondanze nel common /allin/: +C Rxij,Ryij,Rzij, iaus usati solo fino a call CALCALL escluso; +C Xcosgi,fsour usati solo da CALCALL compresa in poi. +C - Qualcosa in LUCE1 puo' essere messo integer*2 (IGAINED,ilost) +C - Il problema principale sono i tempi di esecuzione della riflessione +C sto cercando di usare un doppio grid (fine per eclisse, coarse per +C riflessione) in modo da abbreviare il tempo di calcolo della +C riflessione. I path sono moltissimi, per una stella descritta +C da un 10000 surf.elem.,ove eclisse e' precisa piu' di qualche %, +C si va sul mezzo milione di paths,ci si sta a fatica anche come spazio. +C Poiche' la riflessione per 2 stelle eguali a contatto va sul +C 3-4 % della luce dell'oggetto, diminuire il numero di punti +C per la riflessione di un ordine di grandezza potrebbe andare. +C Le subroutine di riflessione hanno tempo ed ingombro accettabile +C per oggetti descritti da circa un 100 surface elements. +C Altro modo di ridurre i punti e' usare surf. elements con +C egual area uinvece che egual numero di fi per ogni theta. +C Questo riduce il numero di punti di circa 1/3, a parita' +C di precisione. +C - L'inserimento in un metodo di minimo totale puo' consistere +C nel trasformare il main , dal 300 continue in poi, +C in una routine, chiamata dalla subroutine di minimo, che +C lo pilota tramite i flags e parametri, a seconda di cosa cambia +C nel modello; ma i parametri e flags non sono ben pensati +C per questo uso. +C - Benche' parte del programma sia predisposta per un calcolo +C su diverse bande di luce, la riflessione tratta per ora +C solo il bolometrico. +C qui non mi e' chiaro come procedere; ora con la riflessione +C potrei (ma non ancora c'e') aumentare o T e poi ricalcolare +C i flussi della banda; oppure, +C nel caso in cui do' in input il flusso di ogni banda, +C divido il flusso bol.+riflesso bol. nelle bande secondo l'input. +C PER QUANTO RIGUARDA L'ALBEDO abbiamo una ALBEDO eguale per +C ogni oggetto (PAR(ippar(9))) che e' semplicemente un flag, che +C andando da 0 ad 1 attenua l'effetto della riflessione ed +C una albedo (PARS(12,IS)), definita per ogni oggetto, +C che fa la stessa cosa. Potra' essere comodo in input, ma +C averne 2 intruduce un conto in piu' in un punto critico del programma. +C Conviene fare una riflessione con albedo dipendente dall'oggetto +C e dal colore? Questo equivale ad un modello +C di atmosfera e non ne so molto. +C - Gli elementi di superficie sono in una unica lista, +C indipendentemente dalla stella cui appartengono, a parte +C il risparmio di spazio, serve a qualcosa cio', visto che +C spesso tratto oggetto per oggetto e devo portarmi dietro +C una collezione di puntatori per sapere dove iniziano e finiscono? +C - Spazi ausiliari probabilmente ridondanti:IAUS,NUMOBJ,AUS,AUS1 +C - GC e' usato solo per rinormalizzare GCX,GCY,GCZ, si puo' non conservare +C - Bisogna inserire controlli sulla possibilita' di avere +C oggetti intersecantisi. Il programma non se ne accorge e pasticcia +C riflessione ed eclissi. +C - Approssimazioni numeriche nei sin e cos fanno si che aree e +C distanze abbiano solo 4 cifre significative, qualcosa forse +C andra' messo in doppia precisione. In certi punti si rimedia a +C questo mettendo =0 le cose sotto R4prec. Ma, per esempio in CYL, +C thin disk a spessore varabile, quando si usano sui 50000 punti +C le approssimazioni numeriche danno gia' nel calcolo area tot +C un errore circa del 0,04 % +C - Per come e' ora ALLSEL dimcx,y,z puo' essere abs(dimcx,y,z) +C con ovvio risparmio di tempo. +C - Le routines lobesf1,lobesf2,lobesf2 sono da modificare, +C riscrivendo le espressioni in modo da eliminare le potenze +C - usare adimensional units per accorciare calcolo flussi da T**4 +C mettendo: ac/4pi=AC4PI=1 +C - ridondanze ed ineleganze in opzioni di stampe ed altre. +C la frazione di luce in una banda per un oggetto in PAR +C andrebbe usata per metterci il valore calcolato , ora in +C /filtri/ .. compfrac(banda,object). Non si puo' finche' +C e' usata anche per segnalare che T usare nella plankiana. +C Anche i vari modflag delle bande di colore possono non essere OK. +C - Bisogna notare che il coefficiente di gravity darkening e', +C seguendo Wilson, g=4*beta. Beta e' la notazione di Lucey +C - Per finire: l'inglese dei commenti e' lievemente penoso. +C +C *********************************************************** +C ARRAYS AND VARIABLES DESCRIPTION +C +C PARAMETER Statements are used for compile-time dimensioning: +C MAXPT= number of fine grid surface points describing the 3 objects +C MAXPTC= number of coarse grid surface points describing the 3 objects +C MAXALLIN= number of reflection paths +C MAXFASI= number of values for the phase +C maxbande= 5 usually UBVRI +C maxflags= number of flags defining the program run +C maxfval=number of flag value descriptors +C maxpar= number of parameters describing the system +C maxpars= number of parameters describing each object +C MAXCELL= number of grid points used in light integration +C maxtitle= number of max title line for printed output +C maxfilt= number of max colour bands +C maxlam= number of max lambda points describing a colour band +C +C COMMON/SURF/ fine grid description the surface elements of the system: +C NPNTMX=MAXPT=maximum number of surface elements used to describe +C the 3 objects of the system: the two stars and the disk. +C NPNT=actual number of surface elements +C NPNT1= number of surface elements for object 1 +C NPNT2,NPNT3= same for objects 2 and 3 +C N1I,N1F= first and last surface element for object 1 in following arrays +C N2I,N2F,N3I,N3F= same for objects 2 and 3 +C X,Y,Z= position of each surface element in the corotating system +C G= surface gravity +C GX,GY,GZ= component of the normal unit vector to the surface element +C FX,FY,FZ= components of the surf.element tangent vector (along phi) +C TX,TY,TZ= components of the surf.element tangent vector (along theta) +C T= temperature of the surface element +C A= area of the surface element +C FB=bolometric flux of the surface element (reflection excluded) +C F= flux for each color +C FRIFL= flux reflected from the surface element +C NUMOBJ= number of the object for each surface element +C XLIMB= limb darkening coefficient for each surf. element +C ALB= albedo for each surf. element +C +C COMMON/SURFC/ describes the surface elements of the system: +C similar to /SURF/, but coarse grid, used for reflection computation. +C DIMCX,DIMCY,DIMCZ : lenght of the coarse surf.element +C +C COMMON/ALLIN/ contains data used to compute reflection effects, +C namely a list of reflection paths (alignement's list) containig: +C IAUS is used as a logical existence flag in subroutine ALLSEL +C +C COMMON/LIGHT/ contains phases, observed and computed light +C for each phase and color. maxbande of this common is the +C same as maxfilt of common filtri, this duplication allow +C a more easy management of common dimension during test phases +C FASE= phase values +C O = observed flux for each colour band and phase +C C= computed flux for each band and object and phase +C CT= C summed on objects +C CBOL = bolometric flux for each object and phase +C CBOLT = CBOL summen ob objects +C CBOLR = bolometric reflected flux for each object and phase +C CBOLT = CBOLR summen ob objects +C AREA= total surface area of the star +C FBOLTOT = flux norm factor : ( L norm.*FBOLTOT = true L ) +C FBOL= bolometric tot. luminosity flux for the object without reflected +C FBOLREF= bolometric tot luminosity reflected by the object +C +C COMMON/VISUAL/ contains an array used to compute the light +C received by the observed, namely a grid of points on the +C plane perpendicular to the observer over which the image +C of the system is proiected +C +C COMMON /ROCHE/ roche model Lagrange points and lobe'e dimension +C AL1,AL2,AL3 = x coord of lagrange points : 1,2,3 +C XA1,XA2 = intersection of star A surface with X axis +C XB1,XB2 = same for star B (XB1,XA1 are near inner Lagr.point) +C XB2 near L2, XA2 near L3 +C YA,YB = approx transverse dimesion of critical lobes(common L1) +C See: Plavec - BAC - Vol 15 :165 (1964) +C omegal1,omegal2,omegal3 = omega for critical lobes +C rpole,xpole,ypole,zpole,tpole,gxpole,gypole,gzpole = position, radius, +C temperature, surf. versor for pole surf.element +C +C COMMON/FILTRI/ contains the colour bands description, filled in +C routine FILFILT. maxfilt of this common is the +C same as maxbande of common light , this duplication allow +C a more easy management of common dimension during test phases +C NLAMBDA = number of lambda value describing the band +C deltalam = constant step for lambda values +C alambda= lambda values (Anstrong) +C trasmiss= filter trasmission coefficients for the corresponding lambda +C compfrac=computed fraction of intensity for each object in each band +C +C COMMON/PAR/ contains the calculation parameters, which +C can be modified by the user input +C +C COMMON/TITLE/ some title lines to be printed on output +C +C ----------------------------------------------------------------- +C + PARAMETER (MAXPT=200000 ) + PARAMETER (MAXPTC=50000 ,MAXALLIN=250000) + PARAMETER (MAXFASI=1000, MAXBANDE=5) + PARAMETER (MAXFLAG=21 , MAXPAR=128 , MAXPARS=20 ) + PARAMETER (MAXCELL=1000 ) + PARAMETER (MAXTITLE=5) + PARAMETER ( MAXFILT=5 , MAXLAM=15 ) +C + COMMON /SURF/ NPNTMX,NPNT,NPNT1,NPNT2,NPNT3, + A N1I,N1F,N2I,N2F,N3I,N3F, + 1 X(MAXPT),Y(MAXPT),Z(MAXPT), + 2 G(MAXPT),GX(MAXPT),GY(MAXPT),GZ(MAXPT), + 3 FX(MAXPT),FY(MAXPT),FZ(MAXPT), + 4 TX(MAXPT),TY(MAXPT),TZ(MAXPT), + 5 T(MAXPT),A(MAXPT), + 6 FB(MAXPT),F(MAXPT,MAXBANDE),FRIFL(MAXPT), + 7 XLIMB(MAXPT),NUMOBJ(MAXPT),ALB(MAXPT), + 8 NUMCOARSE(MAXPT) + DIMENSION NP123(3) + DIMENSION NIF(2,3) + EQUIVALENCE (NP123(1),NPNT1),(NIF(1,1),N1I) +C + COMMON /SURFC/ NPNTMXC,NPNTC,NPNT1C,NPNT2C,NPNT3C, + A N1IC,N1FC,N2IC,N2FC,N3IC,N3FC, + 1 XC(MAXPTC),YC(MAXPTC),ZC(MAXPTC), + 2 GC(MAXPTC),GXC(MAXPTC),GYC(MAXPTC),GZC(MAXPTC), + 5 AC(MAXPTC), + 6 DIMCX(MAXPTC),DIMCY(MAXPTC),DIMCZ(MAXPTC), + 6 FBC(MAXPTC),FRIFLC(MAXPTC), + 7 XLIMBC(MAXPTC),NUMOBJC(MAXPTC),ALBC(MAXPTC), + 8 NUMFINI(MAXPTC) + DIMENSION NP123C(3) + DIMENSION NIFC(2,3) + EQUIVALENCE (NP123C(1),NPNT1C),(NIFC(1,1),N1IC) +C + COMMON /ALLIN/ NALLMX,NALL,ITERDONE, + 1 ISOUR(MAXALLIN),JRIC(MAXALLIN), + 2 TRANSFI(MAXALLIN),TRANSFJ(MAXALLIN), + 3 FSOURI(MAXALLIN),FSOURJ(MAXALLIN), + 4 FRICI(MAXALLIN),FRICJ(MAXALLIN), + 5 RIJ(MAXALLIN), + 6 RXIJ(MAXALLIN),RYIJ(MAXALLIN),RZIJ(MAXALLIN), + 7 COSGI(MAXALLIN),COSGJ(MAXALLIN), + 8 IAUS(MAXALLIN) +C + COMMON /LIGHT/ NFASIMX,NFASI,NBANDE, + 1 FASE(MAXFASI),O(MAXBANDE,MAXFASI), + 2 C(3,MAXBANDE,MAXFASI),CT(MAXBANDE,MAXFASI), + 3 CBOL(3,MAXFASI),CBOLT(MAXFASI), + 4 CBOLR(3,MAXFASI),CBOLTR(MAXFASI), + 5 AREA(3),FBOLTOT(3),FBOL(3),FBOLREF(3) +C + COMMON /VISUAL/ NCELL,CELLMAX,CELLMIN,DCELL, + 1 XCELL(MAXCELL),YCELL(MAXCELL) + DIMENSION ICELL(MAXCELL,MAXCELL) +C + COMMON /ROCHE/ AL1,AL2,AL3,XA1,XA2,XB1,XB2,YA,YB, + 1 OMEGAL1,OMEGAL2,OMEGAL3, + 2 RPOLE(3),XPOLE(3),YPOLE(3),ZPOLE(3),TPOLE(3), + 3 GXPOLE(3),GYPOLE(3),GZPOLE(3) +C + COMMON /FILTRI/ NFILT,NLAM, NLAMBDA(MAXFILT),DELTALAM(MAXLAM), + 1 ALAMBDA(MAXLAM,MAXFILT),TRASMISS(MAXLAM,MAXFILT), + 2 COMPFRAC(MAXFILT,3) +C + COMMON /PAR/ NFLAG,IFLAG(MAXFLAG),NPAR,PAR(MAXPAR) + DIMENSION PARS(MAXPARS,3) + EQUIVALENCE (PARS(1,1),PAR(1)) +C + COMMON/TITLE/NTITLEMX,NTITLE,TITLE(MAXTITLE) + CHARACTER*80 TITLE +C + DIMENSION IPPAR1(MAXFLAG),IPPAR2(MAXFLAG),MODFLAG(MAXFLAG) +C + CHARACTER *10 NAMFLAG(MAXFLAG) + CHARACTER *20 DESCFLAG(MAXFLAG) +C + CHARACTER *10 NAMPAR(MAXPAR) + CHARACTER *20 DESCPAR(MAXPAR) +C + DIMENSION IFLAGDEF(MAXFLAG),PARDEF(MAXPAR) +C + DIMENSION AUS(MAXPT),AUS1(MAXPT),AUS2(MAXPT),AUS3(MAXPT) +C aus,aus1 used by subroutine sphere (where dimensioned nfi) +C aus,aus1,aus2,aus3 are used by subroutine luce +C (where dimensioned maxpt) +C aus used in subroutine CYL (where dimensioned NTHF*5; NTHF=coarse factor) +C aus used in subroutine PRINTING (dim(MAXPT) to store radii to print +C +C ------------------------------------------------------------- + DATA PI /3.1415926/ +C a*c/4/pi , flux=ac4pi T**4 = erg/cm**2/sec/sterad + DATA AC4PI /1.8065E-5/ +C + LOGICAL KTEST,STOP + LOGICAL PRINTFILE,PRINT6 + LOGICAL PLOTFILE,PLOT6 + EXTERNAL ROCHESF1,ROCHESF2 +C +C The following data define defaults for parameters and flags +C along with a name and a descriptor for each of them. +C For each flag ippar1 and ippar2 are two pointers to the +C parameters, which identify the range of parameters belonging +C to the flag. Same parameters are hidden i.e. not referred to. +C +C -------------------------------------------------------------- + DATA (NAMFLAG(I),DESCFLAG(I),IFLAGDEF(I), + A IPPAR1(I),IPPAR2(I),I=1,MAXFLAG) + 1 /'STARA ',' Star A ', 1, 1,20, + 2 'STARB ',' Star B ', 0, 21,40, + 3 'DISK ',' Disk ', 0, 41,60, + 4 'U ',' U-color band ', 0, 61,65, + 5 'B ',' B-color band ', 0, 69,73, + 6 'V ',' V-color band ', 0, 77,81, + 7 'R ',' R-color band ', 0, 85,89, + 8 'I ',' I-color band ', 0, 93,97, + 9 'REFLECTION',' Reflection comput. ', 1, 101,104, + A 'ZEROREFL ',' Zero refl. source ', 0, 0, 0, + 1 'ORBIT ',' Orbital parameters ', 0, 105,108, + 2 'PHASES ',' Sets phases ', 1, 111,113, + 3 'GRID ',' Sets project.grid', 1, 114,116, + 4 'PARAMETER ',' Sets a parameter ', 0, 1, MAXPAR, + 5 'GO ',' Program runs ', 0, 0, 0, + 6 'STOP ',' Program stops ', 0, 0, 0, + 7 'EXIT ',' Program stops ', 0, 0, 0, + 8 'FLAGS ',' Sets a flag ', 0, 0, 0, + 9 'OFF ',' Set next flags off ', 0, 0, 0, + A 'PRINT ',' Output is printed ', 1, 117,122, + B 'PLOT ',' Plot produced ', 0, 123,127 / +C + DATA (NAMPAR(I),DESCPAR(I),PARDEF(I),I=1,20) + 1 /'SHAPEA ' , ' sphere=1,roche=2 ' , 2.0, + 2 'RA ' , ' radius of star A ' , 0.0, + 3 'X0A ' , ' X position of A ' , 0.0, + 4 'Y0A ' , ' Y position of A ' , 0.0, + 5 'Z0A ' , ' Z position of A ' , 0.0, + 6 'OMEGAA ' , ' potential of A ' , 0.0, + 7 'MESHA ' , ' num. of theta mesh ' , 5.0, + 8 'NPHIA ' , ' unused ' , 0.0, + 9 'GA ' , ' gravity dark. of A ' , 0.0, + O 'TEMPA ' , ' pole temperature A ' , 1.0, + 1 'BOLA ' , ' bolometric lum.of A' , 0.0, + 2 'ALBA ' , ' bolometric albedo A' , 1.0, + 3 'LIMBA ' , ' limb darkening of A' , 0.0, + 4 'CORDA ' , ' arch,cord,tang.seg.' , 3.0, + 5 'RIA ' , ' disk inner radius ' , 0.0, + 6 'HA ' , ' disk height at R ' , 0.0, + 7 'HIA ' , ' disk height at RI ' , 0.0, + 8 'INCLINA ' , ' ang.z-z orbit.plane' , 0.0, + 9 'ROTATEA ' , ' ang.x-x orbit plane' , 0.0, + O 'INNERA ' , ' unused ' , 0.0 / + DATA (NAMPAR(I),DESCPAR(I),PARDEF(I),I=21,40) + 1 /'SHAPEB ' , ' sphere=1,roche=2 ' , 1.0, + 2 'RB ' , ' radius of star B ' , 0.0, + 3 'X0B ' , ' X position of B ' , 0.0, + 4 'Y0B ' , ' Y position of B ' , 0.0, + 5 'Z0B ' , ' Z position of B ' , 0.0, + 6 'OMEGAB ' , ' potential of B ' , 0.0, + 7 'MESHB ' , ' num. of theta mesh ' , 5.0, + 8 'NPHIB ' , ' unused ' , 0.0, + 9 'GB ' , ' gravity dark. of B ' , 0.0, + O 'TEMPB ' , ' pole temperature B ' , 1.0, + 1 'BOLB ' , ' bolometric lum.of B' , 0.0, + 2 'ALBB ' , ' bolometric albedo B' , 1.0, + 3 'LIMBB ' , ' limb darkening of B' , 0.0, + 4 'CORDB ' , ' arch,cord,tang.seg.' , 3.0, + 5 'RIB ' , ' disk inner radius ' , 0.0, + 6 'HB ' , ' disk height at R ' , 0.0, + 7 'HIB ' , ' disk height at RI ' , 0.0, + 8 'INCLINB ' , ' ang.z-z orbit.plane' , 0.0, + 9 'ROTATEB ' , ' ang.x-x orbit plane' , 0.0, + O 'INNERB ' , ' unused ' , 0.0 / + DATA (NAMPAR(I),DESCPAR(I),PARDEF(I),I=41,60) + 1 /'SHAPEC ' , ' disk=3 ' , 3.0, + 2 'RC ' , ' radius of disk:C ' , 4.0, + 3 'X0C ' , ' X position of disk ' , 0.0, + 4 'Y0C ' , ' Y position of disk ' , 0.0, + 5 'Z0C ' , ' Z position of disk ' , 0.0, + 6 'OMEGAC ' , ' potential of C ' , 0.0, + 7 'MESHC ' , ' num. of theta mesh ' , 4.0, + 8 'NPHIC ' , ' unused ' , 0.0, + 9 'GC ' , ' gravity dark. of C ' , 0.0, + O 'TEMPC ' , ' pole temperature C ' , 1.0, + 1 'BOLC ' , ' bolometric lum.of C' , 0.0, + 2 'ALBC ' , ' bolometric albedo C' , 1.0, + 3 'LIMBC ' , ' limb darkening of C' , 0.0, + 4 'CORDC ' , ' arch,cord,tang.seg.' , 0.0, + 5 'RIC ' , ' disk inner radius ' , 0.0, + 6 'HC ' , ' disk height at R ' , 0.0, + 7 'HIC ' , ' disk height at RI ' , 0.0, + 8 'INCLINC ' , ' ang.z-z orbit.plane' , 0.0, + 9 'ROTATEC ' , ' ang.x-x orbit plane' , 0.0, + O 'INNERC ' , ' inner surf drawn ' , 0.0 / +C + DATA (NAMPAR(I),DESCPAR(I),PARDEF(I),I=61,100) + 1 /'ULAMB1 ' , ' U color lambda 1 ' , 3300.0, + 2 'ULAMB2 ' , ' U color lambda 2 ' , 3700.0, + 3 'ULUM_A ' , ' frac. U lumin.for A' , 0.0, + 4 'ULUM_B ' , ' frac. U lumin.for B' , 0.0, + 5 'ULUM_C ' , ' frac. U lumin.for C' , 0.0, + 6 'UALB_A ' , ' albedo U for A ' , 1.0, + 7 'UALB_B ' , ' albedo U for B ' , 1.0, + 8 'UALB_C ' , ' albedo U for C ' , 1.0, + 1 'BLAMB1 ' , ' B color lambda 1 ' , 4300.0, + 2 'BLAMB2 ' , ' B color lambda 2 ' , 4700.0, + 3 'BLUM_A ' , ' frac. B lumin.for A' , 0.0, + 4 'BLUM_B ' , ' frac. B lumin.for B' , 0.0, + 5 'BLUM_C ' , ' frac. B lumin.for C' , 0.0, + 6 'BALB_A ' , ' albedo B for A ' , 1.0, + 7 'BALB_B ' , ' albedo B for B ' , 1.0, + 8 'BALB_C ' , ' albedo B for C ' , 1.0, + 1 'VLAMB1 ' , ' V color lambda 1 ' , 5300.0, + 2 'VLAMB2 ' , ' V color lambda 2 ' , 5700.0, + 3 'VLUM_A ' , ' frac. V lumin.for A' , 0.0, + 4 'VLUM_B ' , ' frac. V lumin.for B' , 0.0, + 5 'VLUM_C ' , ' frac. V lumin.for C' , 0.0, + 6 'VALB_A ' , ' albedo V for A ' , 1.0, + 7 'VALB_B ' , ' albedo V for B ' , 1.0, + 8 'VALB_C ' , ' albedo V for C ' , 1.0, + 1 'RLAMB1 ' , ' R color lambda 1 ' , 6500.0, + 2 'RLAMB2 ' , ' R color lambda 2 ' , 7500.0, + 3 'RLUM_A ' , ' frac. R lumin.for A' , 0.0, + 4 'RLUM_B ' , ' frac. R lumin.for B' , 0.0, + 5 'RLUM_C ' , ' frac. R lumin.for C' , 0.0, + 6 'RALB_A ' , ' albedo R for A ' , 1.0, + 7 'RALB_B ' , ' albedo R for B ' , 1.0, + 8 'RALB_C ' , ' albedo R for C ' , 1.0, + 1 'ILAMB1 ' , ' I color lambda 1 ' , 7500.0, + 2 'ILAMB2 ' , ' I color lambda 2 ' , 8500.0, + 3 'ILUM_A ' , ' frac. I lumin.for A' , 0.0, + 4 'ILUM_B ' , ' frac. I lumin.for B' , 0.0, + 5 'ILUM_C ' , ' frac. I lumin.for C' , 0.0, + 6 'IALB_A ' , ' albedo I for A ' , 1.0, + 7 'IALB_B ' , ' albedo I for B ' , 1.0, + 8 'IALB_C ' , ' albedo I for C ' , 1.0 / + DATA (NAMPAR(I),DESCPAR(I),PARDEF(I),I=101,116) + 1 /'ALBEDO ' , ' bolometric albedo ' , 1.0, + 2 'MAXITER ' , ' maximum iteration ' , 5.0, + 3 'PRECISION ' , ' convergency check ' , 0.001, + 4 'COARSE ' , ' coarsing factor ' , 1.0, + 1 'I ' , ' incl.of orbit plane' , 90.0, + 2 'MRATIO ' , ' mass ratio Mb/Ma ' , 1.0, + 3 'ECC ' , ' orbit eccentricity ' , 0.0, + 4 'PREC ' , ' Newton-Rapson prec.' , 1.E-7, + 5 'NULL ' , ' Unused ' , 0.0, + 6 'NULL ' , ' Unused ' , 0.0, + 1 'NUMPHASES ' , ' num.of equis.phases' , 8.0, + 2 'PHASEUNIT ' , ' unit for input phas' , 0.0, + 3 'NORM ' , ' Light curve norm. ' , 1.0, + 1 'NUMCELLS ' , ' num.of grid points ' , 100.0, + 2 'R4PREC ' , ' sin,cos precision ' , 1.E-5, + 3 'NULL ' , ' Unused ' , 0.0 / +C + DATA (NAMPAR(I),DESCPAR(I),PARDEF(I),I=117,MAXPAR) + 1 /'AMOUNT ' , ' Amount of printing ' , 10.0, + 2 'SCREEN ' , ' Output on screen ' , 1.0, + 3 'UNIT ' , ' Output on this unit' , 11.0, + 4 'MAP ' , ' Map print phas.step' , 1.0, + 5 'REFL ' , ' Reflection details ' , 10.0, + 6 'LIGHT ' , ' Light curve details' , 4.0, + 1 'AMOUNT ' , ' Amount of printing ' , 10.0, + 2 'SCREEN ' , ' Output on screen ' , 1.0, + 3 'UNIT ' , ' Output on this unit' , 11.0, + 4 'MAP ' , ' Map plot phase step' , 1.0, + 5 'FILE ' , ' Output ASCII file ' , 12.0, + 6 'NULL ' , ' unused parameter ' , 0.0 / +C +C ....................................................... + NPNTMX=MAXPT + NPNTMXC=MAXPTC + NALLMX=MAXALLIN + NFASIMX=MAXFASI + NBANDE=MAXBANDE + NPAR=MAXPAR + NFLAG=MAXFLAG + NTITLEMX=MAXTITLE + NFILT=MAXFILT + NLAM=MAXLAM +C +C .......................... elapsed time computation + TEMPO0=SECNDS(0.0) ! VAX VMS, NOT ANSI STANDARD + TEMPREC=0.0 + TEMPIO=0.0 + TEMPIOP=0.0 + TEMPDRAW=0.0 + TEMPREF=0.0 + TEMPCOL=0.0 + TEMPNORM=0.0 + TEMPLUC=0.0 +C +C .......................... Default setting + DO 3 I=1,MAXFLAG + 3 IFLAG(I)=IFLAGDEF(I) + DO 4 I=1,MAXPAR + 4 PAR(I)=PARDEF(I) +C .......................... Colour band definitions + CALL FILFILT + DO 5 J=1,3 + DO 5 I=1,MAXFILT + 5 COMPFRAC(I,J)=0.0 +C .......................... At the beginning there aren't stars + NTITLE=0 + NPNT=0 + NPNT1=0 + NPNT2=0 + NPNT3=0 + N1I=0 + N1F=0 + N2I=0 + N2F=0 + N3I=0 + N3F=0 + NPNTC=0 + NPNT1C=0 + NPNT2C=0 + NPNT3C=0 + N1IC=0 + N1FC=0 + N2IC=0 + N2FC=0 + N3IC=0 + N3FC=0 +C ...................... At the beginning there isn't project.grid + NCELL=0 + DCELL=0 +C ...................... Testing some internal dimension + IF(NFILT.NE.NBANDE) THEN + WRITE(6,990) NFILT,NBANDE + 990 FORMAT(' WARNING! The number of colour bands in commons ', + 1 ' light and filtri is different:',2I5) + ENDIF +C + WRITE(6,999) + 999 FORMAT(1H1,20X,' CLOSE BINARY SYSTEM ANALYSIS PROGRAM'/ + 1 20X,' Version 0.0 ( debugging in progress )'//) +C +C ------------ +C =================================== => | INPUT | +C ------------ + 12 CONTINUE + CALL INPUT(NAMFLAG,DESCFLAG,IFLAGDEF,NAMPAR,DESCPAR,PARDEF, + 1 IPPAR1,IPPAR2,STOP) + IF(STOP) THEN +C Elapsed time computation + IF(IFLAG(20).GT.0) THEN + TEMPO=SECNDS(TEMPO0) + IF(PRINT6) + 1 WRITE(6,8010) TEMPIO,TEMPIOP,TEMPDRAW,TEMPREF, + 2 TEMPCOL,TEMPNORM,TEMPLUC,TEMPO + 8010 FORMAT(///' Total elapsed time for I/O: ',G20.5/ + 1 ' Total elapsed time for plotting: ',G20.5/ + 2 ' Total elapsed time for surface drawing: ',G20.5/ + 3 ' Total elapsed time for reflection : ',G20.5/ + 4 ' Total elapsed time for colour band flux: ',G20.5/ + 4 ' Total elapsed time for flux normalization:',G20.5/ + 5 ' Total elapsed time for light to observer:',G20.5/ + 6 ' Total elapsed time for this run: ',G20.5///) + IF(PRINTFILE) + 1 WRITE(NFILE,8010) TEMPIO,TEMPIOP,TEMPDRAW,TEMPREF, + 2 TEMPCOL,TEMPNORM,TEMPLUC,TEMPO + ENDIF + STOP + ENDIF +C ----------------- +C =================================== => | RUN BEGINS | +C ----------------- + 300 CONTINUE ! 300: unreferenced label +C MODFLAG is used to set off some flags after the corresponding comput.: +C run flag: n.15 - input phases: n.12 - +C stars and disk drawing: n.1,2,3 +C reflection and zero reflection source n.9,10 + MODFLAG(15)=1 + MODFLAG(12)=0 + MODFLAG(1)=0 + MODFLAG(2)=0 + MODFLAG(3)=0 + MODFLAG(9)=0 + MODFLAG(10)=0 +C .......... sets print flags + IF(IFLAG(20).LE.0) THEN + NPRINT=0 + NFILE=6 + NPRINTR=0 + ELSE + K1=IPPAR1(20) + AMOUNT=PAR(K1) +C Screen output + NFILE6=INT(PAR(K1+1)) + IF(NFILE6.GT.0) THEN + PRINT6=.TRUE. + ELSE + PRINT6=.FALSE. + ENDIF +C Output on unit NFILE + NFILE=INT(PAR(K1+2)) + IF(NFILE.GT.0.AND.NFILE.LE.99) THEN + PRINTFILE=.TRUE. + ELSE + PRINTFILE=.FALSE. + ENDIF +C Phase step for printing maps + NPRINT=INT(PAR(K1+3)) +C Light curve details printing + NPRINTL=INT(PAR(K1+5)) +C Reflection hystory printing + NPRINTR=INT(PAR(K1+4)) + IF(PRINTFILE) WRITE(NFILE,999) + ENDIF +C .......... sets plot flags + IF(IFLAG(21).LE.0) THEN + NPLOT=0 + NFILEP=6 + NPRINTR=0 + ELSE + K1=IPPAR1(21) + AMOUNTP=PAR(K1) +C Screen output + NFILE6P=INT(PAR(K1+1)) + IF(NFILE6P.GT.0) THEN + PLOT6=.TRUE. + ELSE + PLOT6=.FALSE. + ENDIF +C Output on unit NFILEP + NFILEP=INT(PAR(K1+2)) + IF(NFILEP.GT.0.AND.NFILEP.LE.99) THEN + PLOTFILE=.TRUE. + ELSE + PLOTFILE=.FALSE. + ENDIF +C Phase step for printing maps + NPLOT=INT(PAR(K1+3)) +C Otput on ASCII file for external plotting + NASCIIP=INT(PAR(K1+4)) + ENDIF +C +C ..................... sin.cos precision parameter +C Sometimes sin,cos < r4prec is assumed 0, avoiding rounding error in +C computing sin and cos near zero, without using double precision. + K1=IPPAR1(13)+1 + R4PREC=PAR(K1) +C --------------------- +C .......................................... Input of phase values +C --------------------- + IF(IFLAG(12).GT.0) THEN + K1=IPPAR1(12) + NFILEF=INT(PAR(K1+1)) + IF(NFILEF.GT.0) THEN + CALL FASREAD(NFASI,NFILEF,NFILE,NFASIMX,FASE) + MODFLAG(12)=1 + PAR(K1)=NFASI + ELSE + NFASI=INT(PAR(K1)) + IF(NFASI.GT.0) THEN + IF(NFASI.GT.NFASIMX) THEN + WRITE(6,3000) NFASIMX,NFASIMX + IF(PRINTFILE)WRITE(NFILE,3000)NFASI,NFASIMX,NFASIMX + 3000 FORMAT(' ERROR! Too mutch phase values requested:',I5/ + 1 ' It is set to the maximum value :',I5/ + 2 ' If you need a greater value go into the FORTRAN list to', + 3 ' change: MAXFASI=',I5) + NFASI=NFASIMX + PAR(K1)=NFASI + ENDIF + CALL FASGRID(NFASI,FASE) + MODFLAG(12)=1 + ENDIF + ENDIF + ENDIF +C ............................................................... +C +C I/O Elapsed time computation + IF(IFLAG(20).GT.0) THEN + TEMPO=SECNDS(TEMPO0) + TEMPD=TEMPO-TEMPREC + TEMPREC=TEMPO + TEMPIO=TEMPIO+TEMPD + IF(PRINT6) WRITE(6,8001) TEMPD,TEMPIO +C IF(PRINTFILE) WRITE(NFILE,8001) TEMPD,TEMPIO + 8001 FORMAT(/' Elapsed time for I/O:',12X,G20.5,5X,' Total:',G20.5/) + ENDIF +C +C ................ If Roche model computes Lagrange Points L1,L2,L3 + IF(PARS(1,1).EQ.2..OR.PARS(2,1).EQ.2..OR.PARS(3,1).EQ.2.) THEN + K1=IPPAR1(11) + Q=PAR(K1+1) +C IF(Q.GT.1.) THEN ! The following isn't true +C Q1=1./Q +C WRITE(6,3020)Q,Q1 +C IF(PRINTFILE) WRITE(NFILE,3020)Q,Q1 +C 3020 FORMAT(/' ERROR ! For Roche model object A must be the' +C 1 ' most massive'/' q:',G14.7,' changed to:',G14.7) +C Q=Q1 +C PAR(K1+1)=Q +C ENDIF + PRECISION=PAR(IPPAR1(11)+3) + IF(PRECISION.LT.1.E-7) WRITE(6,3021) PRECISION + 3021 FORMAT(//' WARNING ! Requested Newton-Rapson precision ', + 1 ' may be too small to be used with real*4 numbers:',G14.7//) + CALL LAGR(Q,PRECISION) + IF(PRINT6) WRITE(6,3022) AL1,OMEGAL1,AL2,OMEGAL2,AL3,OMEGAL3 + 3022 FORMAT(/' Computed Lagrange points and potential for', + 1 ' critical lobes:'/,5X,'L1=',G14.7,' omega=',G14.7/ + 2 5X,'L2=',G14.7,' omega=',G14.7/ + 3 5X,'L3=',G14.7,' omega=',G14.7/) + ENDIF +C ------------------- +C ========== => | SURFACE DRAWING | +C ------------------- +C +C ............................................................... +C | The surface of each object (the 2 stars and the disk), is | +C | represented by a number of "surface elements", which are | +C | stored in common /surf/ as a list containing, for each | +C | element, the area, the temperature, the flux etc. | +C ............................................................... +C +C ------------------------------------------loop on stars and disk + DO 30 IS=1,3 +C If the object number IS is not to be drawn goes on + IF(IFLAG(IS).LE.0) GOTO 30 + MODFLAG(IS)=1 +C The reflection has to be recomputed with new grid + IF(IFLAG(9).LT.0) IFLAG(9)=1 + IF(IFLAG(10).LT.0) IFLAG(10)=1 +C +C If the object had been drawn before, +C deletes the old space, rearranging data. +C ALL data in common/surf/are mouved,also if not jet computed. +C Also /surfc/ is compressed. + IF(NP123(IS).GT.0.AND.NIF(1,IS).GT.0.AND.NIF(2,IS).GT.0) + 1 CALL CANCEL(IS,NFILE) +C + NPS=NP123(IS) + NIS=NIF(1,IS) + NFS=NIF(2,IS) + IF(NIS.LE.0) NIS=NPNT+1 + NPSC=NP123C(IS) + NISC=NIFC(1,IS) + NFSC=NIFC(2,IS) + IF(NISC.LE.0) NISC=NPNTC+1 +C +C ......... for sphere or Roche model test and set number of intervals +C + IF(PARS(1,IS).EQ.1..OR.PARS(1,IS).EQ.2.) THEN +C mesh parameter numtheta: number of fine mesh division. + NUMTHETA=INT(PARS(7,IS)) +C Tests if numtheta is consistent, it must be odd > 3 + IF(NUMTHETA.LT.4) NUMTHETA=5 + IF(MOD(NUMTHETA,2).EQ.0) NUMTHETA=NUMTHETA+1 +C Tests if the coarsing factor is consistent, it must be odd +C and a submultiple of numtheta-1 , if not so nthf and +C and numtheta are changed. + K1=IPPAR1(9)+3 + 301 NTHF=INT(PAR(K1)) +C Makes NTHF odd > 0 + IF(NTHF.EQ.0) NTHF=1 + IF(MOD(NTHF,2).EQ.0) NTHF=NTHF+1 +C Makes numtheta consistent with NTHF + 31 CONTINUE + NTHRESTO=MOD(NUMTHETA-1,NTHF) +C This is equal to: MOD(NUMTHETA+2*INT(NTHF/2),NTHF) + IF(NTHRESTO.NE.0) THEN +C changes numtheta + NUMTHETA=NUMTHETA + NTHF - NTHRESTO +C If not so, numtheta is made odd (by adding nthf, odd): + IF(MOD(NUMTHETA,2).EQ.0) NUMTHETA=NUMTHETA+NTHF +C If numtheta too great + IF(NUMTHETA.GT.NPNTMX) THEN + IF(NUMTHETA-NTHF.GT.5) THEN +C decrease numtheta + NUMTHETA=NUMTHETA-NTHF + ELSE +C NTHF is decreased by 2 (it's odd) + NTHF=NTHF-2 + GOTO 31 + ENDIF + ENDIF + ENDIF +C Warnng message and changes input coarsing factor + IF(INT(PAR(K1)).NE.NTHF) THEN + WRITE(6,3053) PAR(K1),NTHF,IS + IF(PRINTFILE) WRITE(NFILE,3053) PAR(K1),NTHF,IS + 3053 FORMAT(/' WARNING! Coarsing factor:',G15.7, + 1 ' has been changed to:',I6/' The coarsing factor', + 2 ' must be odd > 0 and consistent with the mesh', + 3 ' parameter.',5X,'Object:',I3) +C PAR(K1)=NTHF lascio il valore precedente, mentre usa nthf in sfera + ENDIF +C Warning message and changes input numtheta + IF(INT(PARS(7,IS)).NE.NUMTHETA) THEN + WRITE(6,3054) PARS(7,IS),NUMTHETA,NTHF,IS + IF(PRINTFILE) WRITE(NFILE,3054) + 1 PARS(7,IS),NUMTHETA,NTHF,IS + 3054 FORMAT(/' WARNING! MESH parameter:',G15.7, + 1 ' changed to:',I6/ + 1 ' For spheres and Roche it must be odd > 4', + 1 ' and MESH-1 multiple of coarsing factor:',I5, + 2 3X,'Object:',I3) + PARS(7,IS)=NUMTHETA + ENDIF + ELSE IF(PARS(1,IS).EQ.0.0) THEN +C ........................... similar tests for rectangle + NUMTHETA=INT(PARS(7,IS)) + IF(NUMTHETA.LT.0) NUMTHETA=1 + K1=IPPAR1(9)+3 + NTHF=INT(PAR(K1)) +C Makes NTHF odd > 0 + IF(NTHF.EQ.0) NTHF=1 +C The coarsing factor must be a submultiple of theta + NTHRESTO=MOD(NUMTHETA,NTHF) + IF(NTHRESTO.NE.0) NUMTHETA=NUMTHETA+NTHF-NTHRESTO + IF(NUMTHETA.NE.INT(PARS(7,IS)) ) THEN + WRITE(6,3062) PARS(7,IS),NUMTHETA,IS + IF(PRINTFILE) WRITE(NFILE,3062) PARS(7,IS),NUMTHETA,IS + PARS(7,IS)=NUMTHETA + ENDIF + ELSE IF(PARS(1,IS).EQ.3.0) THEN +C ..................... number of intervals for disk + NUMTHETA=INT(PARS(7,IS)) + IF(NUMTHETA.LT.0) NUMTHETA=1 + K1=IPPAR1(9)+3 + NTHF=INT(PAR(K1)) +C Makes NTHF odd > 0 + IF(NTHF.EQ.0) NTHF=1 +C IF(MOD(NTHF,2).EQ.0) THEN +C PAR(K1)=PAR(K1)+1 +C WRITE(6,3052) NTHF,PAR(K1),IS +C IF(PRINTFILE) WRITE(NFILE,3052) NTHF,PAR(K1),IS +C NTHF=NTHF+1 +C3052 FORMAT(/' WARNING! The input coarsing factor:', +C 1 I5,' has been changed to the odd value:',G15.7, +C 2 2X,'Object:',I3) +C ENDIF +C The coarsing factor must be a submultiple of theta + NTHRESTO=MOD(NUMTHETA,NTHF) + IF(NTHRESTO.NE.0) NUMTHETA=NUMTHETA+NTHF-NTHRESTO + IF(NUMTHETA.NE.INT(PARS(7,IS)) ) THEN + WRITE(6,3062) PARS(7,IS),NUMTHETA,IS + IF(PRINTFILE) WRITE(NFILE,3062) PARS(7,IS),NUMTHETA,IS + 3062 FORMAT(/' WARNING! The mesh parameter :', + 1 G15.7,' has been changed to the value:',I5/ + 2 ' Consistent with the coarsing factor',5X,'Object:',I3) + PARS(7,IS)=NUMTHETA + ENDIF + ENDIF +C ------------ +C ............. SINGLE POINT ,in a rectangular interval +C ------------ + IF(PARS(1,IS).EQ.0.0) THEN +C +C +C Test other values: radius: i.e. X half-edge + RAGGIO=PARS(2,IS) + IF(RAGGIO.LT.0.0) THEN + RAGGIO=0. + WRITE(6,3010) IS,PARS(2,IS),RAGGIO + IF(PRINTFILE) WRITE(NFILE,3010) IS,PARS(2,IS),RAGGIO + 3010 FORMAT(' ERROR! : Object:',I3,' Absurd radius value:',G15.7, + 1 ' changed to:',G15.7) + PARS(2,IS)=0.0 + ENDIF +C +C Y half-edge + RAGGIOI=PARS(15,IS) + IF(RAGGIOI.LT.RAGGIO) THEN + RAGGIOI=RAGGIO + WRITE(6,3012) IS,PARS(15,IS),RAGGIOI + IF(PRINTFILE) WRITE(NFILE,3012) IS,PARS(15,IS),RAGGIOI + 3012 FORMAT(' Object:',I3,' Y Input radius ( < X radius):',G15.7, + 1 ' changed to X radius:',G15.7) + ELSE IF(MOD(RAGGIOI,RAGGIO).GT.R4PREC) THEN + RAGGIOI=RAGGIO*INT(RAGGIOI/RAGGIO) + WRITE(6,3014) IS,PARS(15,IS),RAGGIOI + IF(PRINTFILE) WRITE(NFILE,3014) IS,PARS(15,IS),RAGGIOI + 3014 FORMAT(' WARNING! Object:',I3/' Y Input radius:',G15.7, + 1 ' changed to :',G15.7,' multiple of X radius') + ENDIF +C +C NPSSC is the number of the first void coarse, it is updated +C by CYL, NPSS is computed by CYL as the number of fine made by CYL + NPSSC=NISC + NPNTMX1=NPNTMX-NIS+1 + ALZO =(PI/180.)*PARS(18,IS) + ROTAZ=(PI/180.)*PARS(19,IS) + PKRI=PARS(20,IS) +C + CALL POINT(PRINT6,PRINTFILE,NFILE,NUMTHETA,NTHF,PKRI,IS, + 1 NPSS,NPSSC,RAGGIO,RAGGIOI, + 2 PARS(3,IS),PARS(4,IS),PARS(5,IS), + 3 ALZO,ROTAZ,R4PREC,NPNTMX1,X(NIS),Y(NIS),Z(NIS), + 4 G(NIS),GX(NIS),GY(NIS),GZ(NIS), + 5 FX(NIS),FY(NIS),FZ(NIS),TX(NIS),TY(NIS),TZ(NIS), + 6 AREA(IS),A(NIS),NUMCOARSE(NIS),NUMOBJ(NIS)) +C +C NUMOBJ is assigned into subroutine POINT; not outside, as in SFERA2. +C +C ----------------- +C ............. SPHERICAL SURFACE, drawn by equi-area intervals +C ----------------- + ELSE IF( PARS(1,IS).EQ.1.0) THEN +C +C Test other values + RAGGIO=PARS(2,IS) + IF(RAGGIO.LT.0) THEN + RAGGIO=0. + WRITE(6,3010) IS,PARS(2,IS),RAGGIO + IF(PRINTFILE) WRITE(NFILE,3010) IS,PARS(2,IS),RAGGIO + PARS(2,IS)=0.0 + ENDIF +C +C NPSSC is updated and NPSS is computed by sfera2: +C if you are drawing surfaces for the first time, then NPSSC +C is the next free coarse surf element (total number of coarse points +C (for all objects) +1 ).Otherwise the first coarse of next object. +C NPSS is the number of fine surf.interval for this object. +C NCORD is the cord option, NPNTMX1 the available space for surf.el. + NPSSC=NISC + NCORD=INT(PARS(14,IS)) + NPNTMX1=NPNTMX-NIS+1 +C + CALL SFERA2(PRINT6,PRINTFILE,NFILE,NUMTHETA,NTHF,NCORD,NPSS, + 1 NPSSC,RAGGIO,PARS(3,IS),PARS(4,IS),PARS(5,IS), + 2 NPNTMX1,X(NIS),Y(NIS),Z(NIS),G(NIS),GX(NIS), + 3 GY(NIS),GZ(NIS),FX(NIS),FY(NIS),FZ(NIS), + 4 TX(NIS),TY(NIS),TZ(NIS), + 5 AREA(IS),A(NIS),NUMCOARSE(NIS),AUS,AUS1 ) +C +C NUMOBJ, number of object for each surf. el., is used in LUCE1 +C to distinguish between the surf.el. of different objects and printings + CALL FILL(NPSS,IS,NUMOBJ(NIS)) +C + ELSE IF (PARS(1,IS).EQ.2.) THEN +C ---------- +C ................................... ROCHE LOBE drawing +C ---------- +C The star A (main body) is drawn in (0,0,0) and +C the star B in (1,0,0) (The distance between the stars +C acts as the distance unit measure). The stars can be +C shifted to an input given x point: PARS(3,is), this +C is equivalent to change Omega, and will be faster. +C This option is't valid for object 3 + IF(IS.EQ.3) THEN + WRITE(6,3073) + 3073 FORMAT(' ERROR! Roche model not allowed for object 3,', + 1 ' object not drawn!') + GOTO 30 + ENDIF +C .....Testing y and z for the body center + IF(PARS(4,IS).NE.0.0.OR.PARS(5,IS).NE.0.) THEN + WRITE(6,3074) IS + 3074 FORMAT(' WARNING! ,for Roche model the object:',I3, + 1 ' must be in (X,0,0)') + PARS(4,IS)=0.0 + PARS(5,IS)=0.0 + ENDIF +C + Q=PAR(IPPAR1(11)+1) + PRECISION=PAR(IPPAR1(11)+3) + IF(PRECISION.LT.1.E-7) WRITE(6,3021) PRECISION +C ... test lobes-x axis intersection, computes omega from R if not given + CALL LOBES(Q,PRECISION,PARS(6,IS),PARS(2,IS),IS) + XSHIFT=PARS(3,IS) +C for object 2 the star is drawn n (1,0,0) : sets the correct shift: + IF(IS.EQ.2) XSHIFT=XSHIFT-1. + OMEGA=PARS(6,IS) + NPSSC=NISC + NCORD=INT(PARS(14,IS)) + NPNTMX1=NPNTMX-NIS+1 + IF(IS.EQ.1) THEN +C the first point XA is near Lagr.point L1 + XA=XA1 + XB=XA2 + RIS=0.0 + IF(PRINT6) WRITE(6,3080) IS,XA1,XA2,XA + 3080 FORMAT(/' Surface-X axis intersection for object:',I2, + 1 ' computed as:',G14.7,2X,G14.7/ + 2 ' Surface drawing starts from point:',G14.7/) +C + CALL ROCHES(PRINT6,PRINTFILE,NFILE,NUMTHETA,NTHF,NCORD,NPSS, + 1 NPSSC,XA,XB,XSHIFT,OMEGA,Q,RIS,PRECISION, + 2 NPNTMX1,X(NIS),Y(NIS),Z(NIS),G(NIS),GX(NIS), + 3 GY(NIS),GZ(NIS),FX(NIS),FY(NIS),FZ(NIS), + 4 TX(NIS),TY(NIS),TZ(NIS), + 5 AREA(IS),A(NIS),NUMCOARSE(NIS),AUS,AUS1,ROCHESF1) + ELSE +C the last point XB is near Lagr.point L1 + XA=XB2 + XB=XB1 + RIS=1.0 + IF(PRINT6) WRITE(6,3080) IS,XB1,XB2,XA +C + CALL ROCHES(PRINT6,PRINTFILE,NFILE,NUMTHETA,NTHF,NCORD,NPSS, + 1 NPSSC,XA,XB,XSHIFT,OMEGA,Q,RIS,PRECISION, + 2 NPNTMX1,X(NIS),Y(NIS),Z(NIS),G(NIS),GX(NIS), + 3 GY(NIS),GZ(NIS),FX(NIS),FY(NIS),FZ(NIS), + 4 TX(NIS),TY(NIS),TZ(NIS), + 5 AREA(IS),A(NIS),NUMCOARSE(NIS),AUS,AUS1,ROCHESF2) + ENDIF +C Assign the object number to the surface elements + CALL FILL(NPSS,IS,NUMOBJ(NIS)) +C +C ---- +C .................................. DISK drawing +C ---- + ELSE IF (PARS(1,IS).EQ.3.) THEN +C +C Test other values + RAGGIO=PARS(2,IS) + IF(RAGGIO.LT.0) THEN + RAGGIO=0. + WRITE(6,3010) IS,PARS(2,IS),RAGGIO + IF(PRINTFILE) WRITE(NFILE,3010) IS,PARS(2,IS),RAGGIO + PARS(2,IS)=0.0 + ENDIF + RAGGIOI=PARS(15,IS) + IF(RAGGIOI.LT.0.0) THEN + RAGGIOI=0.0 + WRITE(6,3010) IS,PARS(15,IS),RAGGIOI + IF(PRINTFILE) WRITE(NFILE,3010) IS,PARS(15,IS),RAGGIOI + PARS(2,IS)=0.0 + ENDIF +C +C NPSSC is the number of the first void coarse, it is updated +C by CYL, NPSS is computed by CYL as the number of fine made by CYL + NPSSC=NISC + NCORD=INT(PARS(14,IS)) + NPNTMX1=NPNTMX-NIS+1 + ALZO =(PI/180.)*PARS(18,IS) + ROTAZ=(PI/180.)*PARS(19,IS) + PKRI=PARS(20,IS) +C + CALL CYL(PRINT6,PRINTFILE,NFILE,NUMTHETA,NTHF,NCORD,PKRI,IS, + 1 NPSS,NPSSC,RAGGIO,RAGGIOI,PARS(16,IS), + 2 PARS(17,IS),PARS(3,IS),PARS(4,IS),PARS(5,IS), + 3 ALZO,ROTAZ,R4PREC,NPNTMX1,X(NIS),Y(NIS),Z(NIS), + 4 G(NIS),GX(NIS),GY(NIS),GZ(NIS), + 5 FX(NIS),FY(NIS),FZ(NIS),TX(NIS),TY(NIS),TZ(NIS), + 6 AREA(IS),A(NIS),NUMCOARSE(NIS),NUMOBJ(NIS), + 7 AUS,AUS(NTHF+1),AUS(2*NTHF+1),AUS(3*NTHF+1), + 8 AUS(4*NTHF+1) ) +C +C NUMOBJ is assigned into subroutine CYL; not outside, as in SFERA2. +C + ENDIF +C Assign the parameters of the surface element list +C for the drawn object + NIF(1,IS)=NIS + NIF(2,IS)=NIS+NPSS-1 + NP123(IS)=NPSS + NPNT=NPNT+NPSS +C nifc(2,is)=0 means coarse map done, but NOT coarse surf elem. + NIFC(1,IS)=NISC + NIFC(2,IS)=0 + NP123C(IS)=NPSSC-NISC + NPNTC=NPNTC+NP123C(IS) +C +C ----------------------------------------------------- +C ................GRAVITY DARKENED TEMPERATURE PROFILE AND SURF.EL FLUX +C ----------------------------------------------------- +C ( Sets FB(i),T(i),i=nis,nfs) +C +C If g , gravity darkening parameter, is set + IF(PARS(9,IS).NE.0.0) THEN +C Computes gravity darkened temperature given by beta: +C Pars(9,is) is the g gravity dark. coeff. definition by Wilson +C different from Lucey and Von Zeipel beta coefficient +C pars(10,is) is the input pole temperature= max T + BETA=PARS(9,IS)*0.25 + CALL GRAVITY1(KK,NPSS,BETA,PARS(10,IS),G(NIS),T(NIS)) +C Store pole values for printing + KK=NIS+KK-1 + XPOLE(IS)=X(KK) + YPOLE(IS)=Y(KK) + ZPOLE(IS)=Z(KK) + TPOLE(IS)=T(KK) + RPOLE(IS)=SQRT((X(KK)-PARS(3,IS))**2 +(Y(KK)-PARS(4,IS))**2+ + 1 (Z(KK)-PARS(5,IS))**2 ) + GXPOLE(IS)=GX(KK) + GYPOLE(IS)=GY(KK) + GZPOLE(IS)=GZ(KK) +C +C and bolometric flux is given by T**4 in each point +C flux = caT**4/(4PI)=erg/cm**2/sec/sterad +C to shorten calculation we could assume here c*a*T**4/(4*pi)=1 + CALL LBOLT(NPSS,FB(NIS),T(NIS),A(NIS)) + ELSE +C uniform temperature and flux in each surface element + EFFE=PARS(10,IS)**4 *AC4PI + CALL FILL(NPSS,PARS(10,IS),T(NIS)) + CALL FILL1(NPSS,EFFE,FB(NIS),A(NIS)) + ENDIF +C -------------------------------- +C ....................... LIMB DARKENING AND ALBEDO COEFF. +C -------------------------------- +C (Sets XLIMB(i),ALB(i),i=nis,nfs) +C eventually a T-dependence could be inserted here + DARKLIM=PARS(13,IS) + ALBIS=PARS(12,IS) + CALL LIMB(NPSS,DARKLIM,ALBIS,T(NIS),XLIMB(NIS),ALB(NIS)) +C +C Drawing elapsed time computation + IF(IFLAG(20).GT.0) THEN + TEMPO=SECNDS(TEMPO0) + TEMPD=TEMPO-TEMPREC + TEMPREC=TEMPO + TEMPDRAW=TEMPDRAW+TEMPD + IF(PRINT6) WRITE(6,8002) TEMPD,TEMPDRAW +C IF(PRINTFILE) WRITE(NFILE,8002) TEMPD,TEMPDRAW + 8002 FORMAT(/' Elapsed time for surface drawing:', + 1 G20.5,5X,' Total:',G20.5/) + ENDIF +C + 30 CONTINUE +C ---------------------------------------- end of loop on stars +C +C +C +C -------------------------- +C ============== => | REFLECTION | +C -------------------------- + IF(IFLAG(9).GT.0) THEN + MODFLAG(9)=1 +C In this case only obtain frifl from friflc from previous run + IF(IFLAG(9).EQ.2) GOTO 320 +C +C Look if, for some object, the coarse map must be used +C to compute the coarse surf.elements in common /surfc/: + DO 32 IS=1,3 + IF(NIFC(2,IS).LE.0.AND.NP123C(IS).GT.0) THEN + IF(NPNTC.GT.NPNTMXC) THEN + WRITE(6,3100) IS,NP123C(IS),NPNTMXC + IF( PRINTFILE) WRITE(NFILE,3100) IS,NP123C(IS),NPNTMXC + 3100 FORMAT(' ERROR: for object',I2,' I can''t use',I6, + 1 ' coarse surface elements for reflection.'/ + 2 ' Reduce the number of coarse surface elements for some object,'/ + 3 ' or go into the FORTRAN list to change parameter MAXPTC, now:', + 4 I6) + ENDIF + CALL COARSE(PRINT6,PRINTFILE,NFILE,IS) + ENDIF + 32 CONTINUE +C +C Bolometric reflection is used to compute a bolometric +C reflected flux for each surface element : FRIFL(NPNT) +C An albedo parameter (ALBEDO) which wheights the reflection +C efficiency is used for all the objects; a similar input +C parameter exists for each object. + ALBEDO=PAR(IPPAR1(9)) + MAXITER=INT(PAR(IPPAR1(9)+1)) + PRECISION=PAR(IPPAR1(9)+2) +C Computing reflected flux for each coarse surface elememt + CALL REFLECT(MAXITER,PRECISION,R4PREC,ALBEDO,NPRINTR,NFILE, + 1 AUS) +C Computing total bolometric reflected lum. for each object + 320 CALL SUMREFL(NPNTC,NIFC,FBOLREF,FRIFLC) +C From coarse to fine surf.el.reflected flux(FRIFLC=>FRIFL) + CALL FINEFRIFL +C if black body is used for any color or object to obtain +C flux fraction from t for each surf. element +C T must changed in each surf. element after reflection + DO 33 IS=1,3 + IF(IFLAG(IS).LE.0) GOTO 33 + DO 33 IB=1,NBANDE + IF(IFLAG(IB+3).LE.0) GOTO 33 + K1=IPPAR1(IB+3)+1 + ALFRAC=PAR(K1+IS) + IF(ALFRAC.GE.0.0) GOTO 33 +C in this case T of single surf element is used (see loop 44 below) + CALL TCHANGE(NPNT,FB,FRIFL,T,A) + GOTO 330 + 33 CONTINUE + 330 CONTINUE +C If a T dependent limb darkening is used you should +C iterate correcting t and then returninig to compute +C reflection with the new limb.dark. coefficient. +C This is not implemented being a too heavy computation. +C +C Reflection elapsed time computation + IF(PRINT6) THEN + TEMPO=SECNDS(TEMPO0) + TEMPD=TEMPO-TEMPREC + TEMPREC=TEMPO + TEMPREF=TEMPREF+TEMPD + IF (PRINT6) WRITE(6,8003) TEMPD,TEMPREF +C IF (PRINTFILE) WRITE(NFILE,8003) TEMPD,TEMPREF + 8003 FORMAT(/' Elapsed time for reflection:',5X,G20.5, + 1 5X,' Total:',G20.5/) + ENDIF +C + ENDIF +C ........... Set reflection source to zero(Fbolref,frifl=0) + IF(IFLAG(10).GT.0) THEN + MODFLAG(10)=1 + CALL NOREFL(NPNT,NIF,FBOLREF,FRIFL) + ENDIF +C +C --------------------- +C .......................... TOTAL BOLOMETRIC FLUX +C --------------------- +C +C Computing FBOL : total bolometric flux for +C each object. +C FBOLTOT, flux normalization factor is set =1. +C Flux normalization is performad after colour band computation +C + DO 35 IS=1,3 + NIS=NIF(1,IS) + IF(NIS.LE.0) GOTO 35 + NPSS=NP123(IS) + IF(NPSS.LE.0) GOTO 35 + CALL TOTALE(NPSS,FBOL(IS),FB(NIS)) + FBOLTOT(IS)=1. + 35 CONTINUE +C +C -------------------------- +C ================ => | SETS COLOUR BAND FLUX | +C -------------------------- +C +C ------------------------------------------loop on stars and disk + DO 40 IS=1,3 + NIS=NIF(1,IS) + IF(NIS.LE.0) GOTO 40 + NPSS=NP123(IS) + IF(NPSS.LE.0) GOTO 40 +C ............................ Sets the flux of each color band: +C F(surf.el,colour)=FB(surf.el) * flux fraction in the colour +C We have the following choices: +C a)- alfrac>0 alfrac is used, flux is not computed +C indepentent on alam1=alam2, alam1<>alam2 +C b)- alfrac<0 band flux is computed for each surf. element +C T of single surf. el. is adjusted after reflection +C in loop 33 +C c)- alfrac=0 colour band flux is computed from avarage T +C (not corrected for reflection) +C +C 1 - monocromatic flux :alam1=alam2 +C 2 - band flux by integrating planK*colour filter +C -----------------------------------------loop on colors + DO 44 IB=1,NBANDE +C If the color band IB isn't requested goes on + IF(IFLAG(IB+3).LE.0) GOTO 44 + K1=IPPAR1(IB+3)+1 + ALFRAC=PAR(K1+IS) + TEMPER=PARS(10,IS) + ALAM1=PAR(IPPAR1(IB+3)) + ALAM2=PAR(IPPAR1(IB+3)+1) + IF(ALFRAC.GT.0.0) THEN +C input given flux fraction in the band F=(FB+FRIFL)*ALFRAC + CALL BANDFIL(NPSS,ALFRAC,FB(NIS),FRIFL(NIS),F(NIS,IB)) + ELSE IF(ALAM1.EQ.ALAM2) THEN +C monocromatic light curve + IF(ALFRAC.EQ.0.0) THEN +C monocromatic flux FRACTION from pole temperature +C plankl=plank*deltal with deltal=1.E-8cm + BANDL=PLANKL(ALAM1,TEMPER)/(AC4PI*TEMPER**4) +C fills F with (FB+FRIFL)*bandl (FB=flux*area) + CALL BANDFIL(NPSS,BANDL,FB(NIS),FRIFL(NIS),F(NIS,IB)) + ELSE IF(ALFRAC.LT.0.0) THEN +C monocromatic flux fraction from t of each surf el. + CALL BANDATM(NPSS,ALAM1,T(NIS),F(NIS,IB),FB(NIS), + 1 FRIFL(NIS)) +C bandl=sum(f*area) tot flux in band for object + ENDIF + ELSE +C if (alam1.ne.alam2) : integrating flux over colour bands + IF(ALFRAC.EQ.0.0) THEN +C flux frac.by integrating plank( T pole) over the colour bands + CALL BANDAC(TOTBAND,TEMPER,NLAMBDA(IB),DELTALAM(IB), + 1 ALAMBDA(1,IB),TRASMISS(1,IB) ) + BANDL=TOTBAND/(AC4PI*TEMPER**4) + CALL BANDFIL(NPSS,BANDL,FB(NIS),FRIFL(NIS),F(NIS,IB)) + ELSE IF(ALFRAC.LT.0.0) THEN +C flux frac.by integrating plank( T for each surf.el.)over bands +C this can be a very heavy computation, don't use. + CALL BANDAT(NPSS,T(NIS),F(NIS,IB),FB(NIS),FRIFL(NIS), + 1 NLAMBDA(IB),DELTALAM(IB),ALAMBDA(1,IB),TRASMISS(1,IB)) +C bandl=sum(f*A) flux in band for object + ENDIF + ENDIF + CALL TOTALE(NPSS,TOTBAND,F(NIS,IB)) + COMPFRAC(IB,IS)=TOTBAND +C +C Colour band flux elapsed time computation + IF(IFLAG(20).GT.0) THEN + TEMPO=SECNDS(TEMPO0) + TEMPD=TEMPO-TEMPREC + TEMPREC=TEMPO + TEMPCOL=TEMPCOL+TEMPD + IF(PRINT6) WRITE(6,8004) TEMPD,TEMPCOL +C IF(PRINTFILE) WRITE(NFILE,8004)TEMPD,TEMPCOL + 8004 FORMAT(/' Elapsed time for color band:',5X,G20.5,5X, + 1 ' Total:',G20.5/) + ENDIF +C + 44 CONTINUE +C -------------------------------------- END of color loop + 40 CONTINUE +C -------------------------------------- end of stars loop +C +C --------------------- +C .......................... FLUX NORMALIZATION +C --------------------- +C +C If a flux is input given for the object, normalizes the +C BOL.flux + REFLECTION to the input flux. +C or to BOL.flux (without reflection) +C Reflection source is normalize in the same way. The colour +C band flux is also normalized in a consistent way. +C + DO 45 IS=1,3 + NIS=NIF(1,IS) + IF(NIS.LE.0) GOTO 45 + NPSS=NP123(IS) + IF(NPSS.LE.0) GOTO 45 +C .................... if normalization requested by input + IF(PARS(11,IS).LE.0.0) GOTO 45 +C +C FACTOR=PARS(11,IS)/(FBOL(IS)+FBOLREF(IS)) + FACTOR=PARS(11,IS)/FBOL(IS) +C ..............bolometric flux normalization + CALL NORM(NPSS,FACTOR,FB(NIS)) + FBOL(IS)=PARS(11,IS) + FBOLTOT(IS)=1./FACTOR +C ..............reflected flux normalization ( if reflection is used ) + IF(IFLAG(9).GT.0.AND.IFLAG(10).LE.0) + 1 CALL NORM(NPSS,FACTOR,FRIFL(NIS)) + FBOLREF(IS)=FBOLREF(IS)*FACTOR +C ..............color flux normalization ( only for used color bands) + DO 47 IB=1,NBANDE + IF(IFLAG(IB+3).LE.0) GOTO 47 + CALL NORM(NPSS,FACTOR,F(NIS,IB)) + COMPFRAC(IB,IS)=COMPFRAC(IB,IS)*FACTOR + 47 CONTINUE + 45 CONTINUE +C +C Normalization elapsed time computation + IF(IFLAG(20).GT.0) THEN + TEMPO=SECNDS(TEMPO0) + TEMPD=TEMPO-TEMPREC + TEMPREC=TEMPO + TEMPNORM=TEMPNORM+TEMPD + IF (PRINT6) WRITE(6,8015) TEMPD,TEMPNORM +C IF (PRINTFILE) WRITE(NFILE,8015) TEMPD,TEMPNORM + 8015 FORMAT(/' Elapsed time for flux normalization:',5X,G20.5, + 1 5X,' Total:',G20.5/) + ENDIF +C ----------------------------------- +C ================== => | COMPUTING LIGHT TO THE OBSERVER | +C ----------------------------------- +C +C ..if an object has been redrawn looks for new max and min x-y-z values + KTEST=.FALSE. + IF(IFLAG(1).GT.0.OR.IFLAG(2).GT.0.OR.IFLAG(3).GT.0) THEN +C Maximum absolute value for x,y and z, which is the maximum +C radius for the drawn system. + CALL MAXABS(CMAX1,NPNT,X) + CALL MAXABS(CMAX2,NPNT,Y) + CALL MAXABS(CMAX3,NPNT,Z) +C The maximum possible linear dimension is the diagonal of x,y,z box + CELLMAX=SQRT(CMAX1*CMAX1+CMAX2*CMAX2+CMAX3*CMAX3) + CELLMIN=-CELLMAX + KTEST=.TRUE. + ENDIF +C +C ........................... Set grid points + K1=IPPAR1(13) + NGP=PAR(K1) + IF (NGP.LE.0.OR.NGP.GT.MAXCELL) THEN + NGP=MAXCELL + WRITE(6,3200) PAR(K1),NGP,NGP + IF(PRINTFILE) WRITE(NFILE,3200) PAR(K1),NGP,NGP + 3200 FORMAT(/' WARNING! The input number of grid points:',G15.7, + 1 ' can''t be greater than:',I5/ + 2 ' If you need a greater value go to the FORTRAN list to', + 3 ' change MAXCELL=',I5) + ENDIF + IF (NCELL.NE.NGP.OR.KTEST) THEN + NCELL=NGP + DCELL=(CELLMAX-CELLMIN)/NCELL + CALL DOCELLS(NCELL,DCELL,CELLMIN,XCELL,YCELL) + ENDIF +C + ANGLEI=(PI/180.)*PAR(IPPAR1(11)) + COSI=COS(ANGLEI) + SINI=SIN(ANGLEI) + IF(ABS(COSI).LT.R4PREC) COSI=0.0 + IF(ABS(SINI).LT.R4PREC) SINI=0.0 +C + CALL LUCE1(NPRINT,PRINT6,PRINTFILE,NFILE,NPRINTL,COSI,SINI, + 1 R4PREC,CELLMAX,CELLMIN,DCELL,NCELL,XCELL,YCELL,ICELL, + 2 AUS,AUS1,AUS2,AUS3,IFLAG(4)) +C +C Normalizing to unit max. the light curve, +C for bolometric flux and each used color band + K1=IPPAR1(12)+2 + ANORMC=PAR(K1) + IF(ANORMC.GT.0.0) CALL NORMC(ANORMC,IFLAG(4)) +C +C Light to observer elapsed time computation + IF(IFLAG(20).GT.0) THEN + TEMPO=SECNDS(TEMPO0) + TEMPD=TEMPO-TEMPREC + TEMPREC=TEMPO + TEMPLUC=TEMPLUC+TEMPD + IF(PRINT6) WRITE(6,8005) TEMPD,TEMPLUC +C IF(PRINTFILE) WRITE(NFILE,8005)TEMPD,TEMPLUC + 8005 FORMAT(/' Elapsed time for received ligth :',G20.5,5X, + 1 ' Total:',G20.5/) + ENDIF +C +C ------------ +C =============== => | PRINTING | +C ------------ + IF (IFLAG(20).GT.0) THEN +C + CALL PRINTING(AMOUNT,NFILE6,NFILE,IPPAR1,IPPAR2, + 1 NAMFLAG,DESCFLAG,NAMPAR,DESCPAR,AUS) +C +C I/O Elapsed time computation + TEMPO=SECNDS(TEMPO0) + TEMPD=TEMPO-TEMPREC + TEMPREC=TEMPO + TEMPIO=TEMPIO+TEMPD + IF(PRINT6) WRITE(6,8001) TEMPD,TEMPIO +C IF(PRINTFILE) WRITE(NFILE,8001)TEMPD,TEMPIO +C + ENDIF +C +C +C ------------ +C =============== => | PLOTTING | +C ------------ + IF (IFLAG(21).GT.0) THEN +C + CALL PLOTTING(PRINTFILE,NFILE,PRINT6, + 1 AMOUNTP,NFILE6P,NFILEP,NASCIIP) +C +C I/O Elapsed time computation + TEMPO=SECNDS(TEMPO0) + TEMPD=TEMPO-TEMPREC + TEMPREC=TEMPO + TEMPIOP=TEMPIOP+TEMPD + IF(PRINT6) WRITE(6,8006) TEMPD,TEMPIOP +C IF(PRINTFILE) WRITE(NFILE,8006)TEMPD,TEMPIOP + 8006 FORMAT(/' Elapsed time for plot:',12X,G20.5,5X,' Total:',G20.5/) +C + ENDIF +C +C + IFLAG(15)=-1 + IF(MODFLAG(1).GT.0) IFLAG(1)=-1 + IF(MODFLAG(2).GT.0) IFLAG(2)=-1 + IF(MODFLAG(3).GT.0) IFLAG(3)=-1 + IF(MODFLAG(12).GT.0) IFLAG(12)=-1 + IF(MODFLAG(9).GT.0) IFLAG(9)=-1 + IF(MODFLAG(10).GT.0) IFLAG(10)=-1 +C +C ...........................................Return to input + GOTO 12 + END +C + SUBROUTINE ALLSEL(K3,NALL1,NALL2) +C --------------------------------------------------------- +C This routine, called by subroutine reflect, check the +C alignement list, from NALL1 to NALL2 ,deleting all alignement +C passing throught the object K3. +C --------------------------------------------------------- + PARAMETER (MAXPT=200000 ,MAXALLIN=250000, MAXBANDE=5) + PARAMETER (MAXPTC=50000) +C + COMMON /SURFC/ NPNTMXC,NPNTC,NPNT1C,NPNT2C,NPNT3C, + A N1IC,N1FC,N2IC,N2FC,N3IC,N3FC, + 1 XC(MAXPTC),YC(MAXPTC),ZC(MAXPTC), + 2 GC(MAXPTC),GXC(MAXPTC),GYC(MAXPTC),GZC(MAXPTC), + 5 AC(MAXPTC), + 6 DIMCX(MAXPTC),DIMCY(MAXPTC),DIMCZ(MAXPTC), + 6 FBC(MAXPTC),FRIFLC(MAXPTC), + 7 XLIMBC(MAXPTC),NUMOBJC(MAXPTC),ALBC(MAXPTC), + 8 NUMFINI(MAXPTC) + DIMENSION NP123C(3) + DIMENSION NIFC(2,3) + EQUIVALENCE (NP123C(1),NPNT1C),(NIFC(1,1),N1IC) +C + COMMON /ALLIN/ NALLMX,NALL,ITERDONE, + 1 ISOUR(MAXALLIN),JRIC(MAXALLIN), + 2 TRANSFI(MAXALLIN),TRANSFJ(MAXALLIN), + 3 FSOURI(MAXALLIN),FSOURJ(MAXALLIN), + 4 FRICI(MAXALLIN),FRICJ(MAXALLIN), + 5 RIJ(MAXALLIN), + 6 RXIJ(MAXALLIN),RYIJ(MAXALLIN),RZIJ(MAXALLIN), + 7 COSGI(MAXALLIN),COSGJ(MAXALLIN), + 8 IAUS(MAXALLIN) +C +C .......................................................... + LOGICAL IAUS,CONDX,CONDY,CONDZ +C +C to avoid looping with no points (nifc(1,k3)=nifc(2,k3)=0) + IF(NP123C(K3).LE.0) RETURN + IF(NALL1.GT.NALL2) RETURN +C + DO 5 I=NALL1,NALL2 + 5 IAUS(I)=.FALSE. +C +C Loops on alignements, looking for poits in K3 belonging +C to the alignement line. + N1=NIFC(1,K3) + N2=NIFC(2,K3) +C + DO 10 I=NALL1,NALL2 + DO 20 K=N1,N2 +C +C ........ First test into or outside interval +C Si puo' semplificare questo groviglio di if ? + XIK=( XC(K) - XC(ISOUR(I)) ) +C If X outside interval Rxij + ABSD=ABS(DIMCX(K)) + IF(RXIJ(I).GE.0.) THEN + IF(XIK .GT. RXIJ(I)+ABSD .OR. XIK .LT. -ABSD) + 1 GOTO 20 + ELSE + IF(XIK .LT. RXIJ(I)-ABSD .OR. XIK .GT. ABSD) + 1 GOTO 20 + ENDIF +C If Y outside interval Ryij + YIK=( YC(K) - YC(ISOUR(I)) ) + ABSD=ABS(DIMCY(K)) + IF(RYIJ(I).GE.0.) THEN + IF(YIK .GT. RYIJ(I)+ABSD .OR. YIK .LT. -ABSD) + 1 GOTO 20 + ELSE + IF(YIK .LT. RYIJ(I)-ABSD .OR. YIK .GT. ABSD) + 1 GOTO 20 + ENDIF +C If Z outside interval Rzij + ZIK=( ZC(K) - ZC(ISOUR(I)) ) + ABSD=ABS(DIMCZ(K)) + IF(RZIJ(I).GE.0.0) THEN + IF(ZIK .GT. RZIJ(I)+ABSD .OR. ZIK .LT. -ABSD) + 1 GOTO 20 + ELSE + IF(ZIK .LT. RZIJ(I)-ABSD .OR. ZIK .GT. ABSD) + 1 GOTO 20 + ENDIF +C +C In these cases the x,y, or z condition hasn't been tested before + IF(ABS(RXIJ(I)).GT.0.0) THEN + CONDX=.TRUE. + ELSE + CONDX=.FALSE. + ENDIF + IF(ABS(RYIJ(I)).GT.0.0) THEN + CONDY=.TRUE. + ELSE + CONDY=.FALSE. + ENDIF + IF(ABS(RZIJ(I)).GT.0.0) THEN + CONDZ=.TRUE. + ELSE + CONDZ=.FALSE. + ENDIF +C ........ Then test if not on same line + IF(CONDX) THEN + IF(CONDY) THEN + DUM =DIMCX(K)*RYIJ(I) + DUM1=DIMCY(K)*RXIJ(I) + AMX=MAX(ABS(DUM+DUM1),ABS(DUM-DUM1)) + IF( ABS( RYIJ(I)*XIK-RXIJ(I)*YIK ) .GT. AMX ) GOTO 20 + ENDIF + IF(CONDZ) THEN + DUM =DIMCX(K)*RZIJ(I) + DUM1=DIMCZ(K)*RXIJ(I) + AMX=MAX(ABS(DUM+DUM1),ABS(DUM-DUM1)) + IF( ABS( RZIJ(I)*XIK-RXIJ(I)*ZIK ) .GT. AMX ) GOTO 20 + ENDIF + ENDIF + IF(CONDY.AND.CONDZ) THEN + DUM =DIMCY(K)*RZIJ(I) + DUM1=DIMCZ(K)*RYIJ(I) + AMX=MAX(ABS(DUM+DUM1),ABS(DUM-DUM1)) + IF( ABS( RZIJ(I)*YIK-RYIJ(I)*ZIK ) .GT. AMX ) GOTO 20 + ENDIF +C +C ........ The remaining surf. el. are aligned + IAUS(I)=.TRUE. +C go to examine the next alignement: + GOTO 10 + 20 CONTINUE + 10 CONTINUE +C +C Now alignements intercepted by K3 are deleted + K=NALL1-1 + DO 30 I=NALL1,NALL2 +C If true skips over the alignement + IF(IAUS(I)) GOTO 30 + K=K+1 + IF(I.EQ.K) GOTO 30 +C If same position just increases K,otherwise move I to K + ISOUR(K)=ISOUR(I) + JRIC(K)=JRIC(I) + RIJ(K)=RIJ(I) +C RXIJ,RYIJ,RZIJ are not mouved, they aren't used anymore + COSGI(K)=COSGI(I) + COSGJ(K)=COSGJ(I) + 30 CONTINUE + NALL=K + RETURN + END +C + FUNCTION AMAX2(N,A) +C ---------------------------------------------------- +C AMAX2=max(a(n)) +C ---------------------------------------------------- + DIMENSION A(N) + AMAX2=A(1) + DO 10 I=2,N + IF(A(I).GT.AMAX2) AMAX2=A(I) + 10 CONTINUE + RETURN + END +C + SUBROUTINE ASK(N1,N2,NAME,DESC,VALUE) +C ---------------------------------------------------- +C Shows parameter's values and descriptors +C ---------------------------------------------------- + CHARACTER*(*) NAME(N2),DESC(N2) + DIMENSION VALUE(N2) + 1000 FORMAT(/(1X,A10,5X,A20,' = ',G15.7)) + WRITE(6,1000)(NAME(J),DESC(J),VALUE(J),J=N1,N2) + RETURN + END +C + SUBROUTINE ASKI(N1,N2,NAME,DESC,IVALUE) +C ---------------------------------------------------- +C Shows flag's values and descriptors +C ---------------------------------------------------- + CHARACTER*(*) NAME(N2),DESC(N2) + DIMENSION IVALUE(N2) + 1000 FORMAT(/(1X,A10,5X,A20,' = ',I2)) + WRITE(6,1000)(NAME(J),DESC(J),IVALUE(J),J=N1,N2) + RETURN + END +C + SUBROUTINE BANDAC(BANDL,TEMPER,NL,DELTAL,ALAMBDA,TRASMISS) +C ---------------------------------------------------------------- +C Computes the flux for photometric band , by integration +C over the lambda range of (Plank function * filter transmission), +C transmission is defined in common/filtri/. +C Computed flux is: erg/cm**2/sec/sterad , +C lambda in Anstrong in /filtri/ , and in the flux computation. +C Simpson rule is used for integration +C BANDL= computed integral +C alam1,alam2= LAMBDA LIMITS (UNUSED ) +C TEMPER=temperature +C ALAMBDA(NL),TRASMISS(NL)= lambda points and their transmission coeff. +C DELTAL=ALAMBDA(2)-ALAMBDA(1) ( Anstrong) +C +C ---------------------------------------------------------------- +C + DIMENSION ALAMBDA(NL),TRASMISS(NL) +C +C come e' fatta sotto e' piu' veloce +C BANDL=0.0 +C PLAN3=PLANK(ALAMBDA(1),TEMPER)*TRASMISS(1) +C DO 20 J=1,NL-2,2 +C PLAN1=PLAN3 +C PLAN2=PLANK(ALAMBDA(J+1),TEMPER)*TRASMISS(J+1) +C PLAN3=PLANK(ALAMBDA(J+2),TEMPER)*TRASMISS(J+2) +C BANDL=BANDL+(1./3.)*PLAN1+(4./3.)*PLAN2+(1./3.)*PLAN3 +C +C DUM=+(1./3.)*PLAN1+(4./3.)*PLAN2+(1./3.)*PLAN3 +C BANDL=BANDL+DUM +C BANDL=BANDL*DELTAL * 1.E-8 +C + BANDL=(1./3.)*PLANK(ALAMBDA(1),TEMPER)*TRASMISS(1) + DO 20 J=2,NL-3,2 + BANDL=BANDL+(4./3.)*PLANK(ALAMBDA(J),TEMPER)*TRASMISS(J)+ + 1 (2./3.)*PLANK(ALAMBDA(J+1),TEMPER)*TRASMISS(J+1) + 20 CONTINUE + BANDL=DELTAL * 1.E-8 * + 1 (BANDL+(4./3.)*PLANK(ALAMBDA(NL-1),TEMPER)*TRASMISS(NL-1)+ + 2 (1./3.)*PLANK(ALAMBDA(NL),TEMPER)*TRASMISS(NL) ) + RETURN + END +C + SUBROUTINE BANDAC1(TOTTOT,TEMPER,NL,DELTAL,ALAMBDA,TRASMISS) +C ---------------------------------------------------------------- +C UNUSED ROUTINE, THIS SHOULD SUBSTITUTE BANDAC, BEING MORE +C PRECISE, BUT THE LINK BETWEEN PLANK LUMINOSITIES IN DIFFERENT +C BANDS AND MAGNITUDE IS NOT WELL ESTABLISHED, FOR THIS REASON +C YOU HAVE ALWAYS AN UNDEFINED MAG. ZERO POINT IN DIFFERENT COLORS +C AND A DETAILED INTEGRATION AVER PLANK FUNCTION IS UNUSEFUL +C +C Computes the flux for photometric band , by integration +C over the lambda range of (Plank function * filter transmission), +C transmission is defined in common/filtri/. for few lambda points. +C Simpson rule is used for integration, using many points and +C interpolating (linear) over the given transmission values +C Computed flux is: erg/cm**2/sec/sterad , +C lambda in Anstrong in /filtri/ , but used in cm in the +C flux computation. +C TOTTOT= computed integral +C TEMPER=temperature +C ALAMBDA(NL),TRASMISS(NL)= lambda points and their transmission coeff. +C DELTAL = delta lambda for tabulated values in /filtri/ (UNUSED ) +C ---------------------------------------------------------------- +C + PARAMETER NSTEPS=20 + DIMENSION ALAMBDA(NL),TRASMISS(NL) +C + TOTTOT=0.0 + DO 10 I=1,NL-1 + AL1=ALAMBDA(I) + AL2=ALAMBDA(I+1) + T1=TRASMISS(I) + T2=TRASMISS(I+1) + DL=(AL2-AL1)/NSTEPS +C changing DL from Anstrong to cm + DL=DL*1.E-8 +C + P1=PLANK(AL1,TEMPER) + P2=PLANK(AL2,TEMPER) + TOT=(1./3.)*T1*P1 + (1./3.)*T2*P2 + DO 20 J=2,NSTEPS-2,2 + AL=AL1+(J-1)*DL + T=( (T2-T1)/(AL2-AL1) ) * (AL-AL1) + T1 + TOT=TOT + (4./3.)*T* PLANK(AL,TEMPER) + AL=AL1+J*DL + T=( (T2-T1)/(AL2-AL1) ) * (AL-AL1) + T1 + TOT=TOT + (2./3.)* PLANK(AL,TEMPER)*T + 20 CONTINUE + AL=AL2-DL + T=( (T2-T1)/(AL2-AL1) ) * (AL-AL1) + T1 + TOT=TOT + (4./3.)* PLANK(AL,TEMPER)*T + TOTTOT=TOTTOT+TOT*DL + 10 CONTINUE + RETURN + END +C + SUBROUTINE BANDAT(NPNT,T,F,FB,FR,NL,DELTAL,ALAMBDA,TRASMISS) +C ----------------------------------------------------------- +C This routine integrates the black body spectrum over +C a given lambda interval for each surface element. +C ----------------------------------------------------------- + DIMENSION T(NPNT),F(NPNT),FB(NPNT),FR(NPNT) + DIMENSION ALAMBDA(NL),TRASMISS(NL) + PARAMETER AC4PI=1.8065E-5 +C + DO 10 I=1,NPNT + TEMPER=T(I) +C integration over colour band + CALL BANDAC(TOTBAND,TEMPER,NL,DELTAL,ALAMBDA,TRASMISS) + F(I)=TOTBAND/(AC4PI*TEMPER**4) * (FB(I)+FR(I)) + 10 CONTINUE +C + RETURN + END +C + SUBROUTINE BANDATM(NPNT,ALAM,T,F,FB,FR) +C ----------------------------------------------------------- +C This routine fills F with bolometric flux FB * flux fraction +C in a given lambda +C FUNCTION PLANKL=PLANK*1.E-8cm = plank*delta lambda +C ----------------------------------------------------------- + DIMENSION T(NPNT),F(NPNT),FB(NPNT),FR(NPNT) + PARAMETER AC4PI=1.8065E-5 +C + DO 10 I=1,NPNT + F(I)=PLANKL(ALAM,T(I))/(AC4PI*T(I)**4) * (FB(I)+FR(I)) + 10 CONTINUE +C + RETURN + END +C + SUBROUTINE BANDFIL(NPNT,B,FB,FR,FBANDA) +C ----------------------------------------------------------- +C This routine assign a given fraction B of the bolometric +C flux B to the color band FBANDA. +C ----------------------------------------------------------- + DIMENSION FB(NPNT),FBANDA(NPNT),FR(NPNT) + DO 10 I=1,NPNT + 10 FBANDA(I)=(FB(I)+FR(I))*B + RETURN + END +C + SUBROUTINE CALCALL(ALBEDO) +C ---------------------------------------------------- +C This routine, called by Reflect, computes the +C remaining data for each allignement, and, for each +C allignement I-J, inserts the inverse allignement J-I +C ---------------------------------------------------- + PARAMETER (MAXPT=200000 ,MAXALLIN=250000, MAXBANDE=5) + PARAMETER (MAXPTC=50000) + PARAMETER (PI4=1./(3.1415926*4.)) + PARAMETER PI=3.1415926 +C + COMMON /SURFC/ NPNTMXC,NPNTC,NPNT1C,NPNT2C,NPNT3C, + A N1IC,N1FC,N2IC,N2FC,N3IC,N3FC, + 1 XC(MAXPTC),YC(MAXPTC),ZC(MAXPTC), + 2 GC(MAXPTC),GXC(MAXPTC),GYC(MAXPTC),GZC(MAXPTC), + 5 AC(MAXPTC), + 6 DIMCX(MAXPTC),DIMCY(MAXPTC),DIMCZ(MAXPTC), + 6 FBC(MAXPTC),FRIFLC(MAXPTC), + 7 XLIMBC(MAXPTC),NUMOBJC(MAXPTC),ALBC(MAXPTC), + 8 NUMFINI(MAXPTC) + DIMENSION NP123C(3) + DIMENSION NIFC(2,3) + EQUIVALENCE (NP123C(1),NPNT1C),(NIFC(1,1),N1IC) +C +C + COMMON /ALLIN/ NALLMX,NALL,ITERDONE, + 1 ISOUR(MAXALLIN),JRIC(MAXALLIN), + 2 TRANSFI(MAXALLIN),TRANSFJ(MAXALLIN), + 3 FSOURI(MAXALLIN),FSOURJ(MAXALLIN), + 4 FRICI(MAXALLIN),FRICJ(MAXALLIN), + 5 RIJ(MAXALLIN), + 6 RXIJ(MAXALLIN),RYIJ(MAXALLIN),RZIJ(MAXALLIN), + 7 COSGI(MAXALLIN),COSGJ(MAXALLIN), + 8 IAUS(MAXALLIN) +C +C ............................................................... +C Computes limb darkening term, allignement transfer +C function and and set the initial reflection source +C for each allignement + DO 30 K=1,NALL +C DD= SQRT(RIJ**2) + DD=SQRT(RIJ(K)) +C abs() -> abs()=abs(cos) + COSGI(K)= COSGI(K) /DD + COSGJ(K)=-COSGJ(K) /DD +C source and receiving surf. el. for reflection + KI=ISOUR(K) + KJ=JRIC(K) +C albedo for source and receiving surf.el. + XCOSGI= 1.0 - ( XLIMBC(KI) * (1.0-COSGI(K)) ) + XCOSGJ= 1.0 - ( XLIMBC(KJ) * (1.0-COSGJ(K)) ) + ALBI=ALBC(KI) + ALBJ=ALBC(KJ) +C transfer function from I to J surf.el. +C TRANSFI(K)=(ALBEDO*PI4)*ALBJ*XCOSGI *COSGJ(K)* +C 1 AC(KJ)/RIJ(K) +C TRANSFI(K)=(ALBEDO)*ALBJ*XCOSGI *(COSGJ(K)*COSGI(K))* +C 1 AC(KJ)/RIJ(K)/PI + TRANSFI(K)=(ALBEDO)*ALBJ*XCOSGI *(COSGJ(K)*COSGI(K))* + 1 AC(KJ)/RIJ(K)/ (PI*(1.-XLIMBC(KJ)/3.) ) +C inverse transfer from J to I +C TRANSFJ(K)=(ALBEDO*PI4)*ALBI*XCOSGJ *COSGI(K)* +C 1 AC(KI)/RIJ(K) +C TRANSFJ(K)=(ALBEDO)*ALBI*XCOSGJ *(COSGJ(K)*COSGI(K))* +C 1 AC(KI)/RIJ(K)/PI + TRANSFJ(K)=(ALBEDO)*ALBI*XCOSGJ *(COSGJ(K)*COSGI(K))* + 1 AC(KI)/RIJ(K)/ (PI*(1.-XLIMBC(KI)/3.) ) +C initial source for reflection from I to J and inverse path + FSOURI(K)=FBC(KI) + FSOURJ(K)=FBC(KJ) + 30 CONTINUE +C + RETURN + END +C + SUBROUTINE CANCEL(K,NFILE) +C ----------------------------------------------------- +C In the surface element list in common /surf/ +C all the data of object K are deleted, by reordering +C of the list. +C ---------------------------------------------------- + PARAMETER (MAXPT=200000 , MAXBANDE=5) + PARAMETER (MAXPTC=50000) + PARAMETER (NVECT=21+MAXBANDE) + PARAMETER (NVECTC=15) + COMMON /SURF/ NPNTMX,NPNT,NP(3),NLIM(2,3), + 1 VECT(MAXPT,NVECT) + COMMON /SURFC/ NPNTMXC,NPNTC,NPC(3),NLIMC(2,3), + 1 VECTC(MAXPTC,NVECTC) +C COMMON /SURFC/ NPNTMXC,NPNTC,NPNT1C,NPNT2C,NPNT3C, +C A N1IC,N1FC,N2IC,N2FC,N3IC,N3FC, +C 1 XC(MAXPTC),YC(MAXPTC),ZC(MAXPTC), +C 2 GC(MAXPTC),GXC(MAXPTC),GYC(MAXPTC),GZC(MAXPTC), +C 5 AC(MAXPTC), +C 6 DIMCX(MAXPTC),DIMCY(MAXPTC),DIMCZ(MAXPTC), +C 6 FBC(MAXPTC),FRIFLC(MAXPTC), +C 7 XLIMBC(MAXPTC),NUMOBJC(MAXPTC),ALBC(MAXPTC), +C 8 NUMFINI(MAXPTC) +C DIMENSION NP123C(3) +C DIMENSION NIFC(2,3) +C EQUIVALENCE (NP123C(1),NPNT1C),(NIFC(1,1),N1IC) +C +C Deleting object K in common /surf/ +C + N1=NLIM(1,K) + N2=NLIM(2,K)+1 + NPNTK=N2-N1 + IF(NPNTK.NE.NP(K)) THEN + WRITE(6,1000) K,NP,NLIM + 1000 FORMAT(' ERROR! The fine grid surface element list descriptors', + 1 ' are inconsistent for object:',I5/' descriptors are:'/ + 2 ' number of points for each object:',3I5/ + 3 ' first and last element for each object:',6I5) + IF(NFILE.GT.0.AND.NFILE.LE.99) WRITE(NFILE,1000) K,NP,NLIM + ENDIF +C + IF(N2.LE.NPNT) THEN +C otherwise a simple change of dimension descriptors deletes the object + DO 10 I=1,NVECT + DO 10 J=N2,NPNT + VECT(J-NPNTK,I)=VECT(J,I) + 10 CONTINUE + DO 20 I=1,3 + IF(I.EQ.K.OR.NLIM(1,I).LT.N2) GOTO 20 + NLIM(1,I)=NLIM(1,I)-NPNTK + NLIM(2,I)=NLIM(2,I)-NPNTK + 20 CONTINUE + ENDIF + NLIM(1,K)=0 + NLIM(2,K)=0 + NP(K)=0 + NPNT=NPNT-NPNTK +C +C Deleting object K in common /surfc/ +C +C Here NLIMC(2,k) is not used, it can be zero if the +C coarse grid map has been computed, but not the coarse surf. elem. +C also in this case this common must be compressed; its space +C is allocated to object K in any case. +C + N1=NLIMC(1,K) + N2=N1+NPC(K) + NPNTK=N2-N1 + IF(N2.LT.N1.OR.N2.GT.NPNTC+1.OR. + 1 (NLIMC(2,K).GT.0.AND.N2.NE.NLIMC(2,K)+1) ) THEN + WRITE(6,3000) K,NPC,NLIMC + 3000 FORMAT(' ERROR! The coarse grid surface element list descripto', + 1 'rs are inconsistent for object:',I5/' descriptors are:'/ + 2 ' number of points for each object:',3I5/ + 3 ' first and last element for each object:',6I5) + IF(NFILE.GT.0.AND.NFILE.LE.99) WRITE(NFILE,3000) K,NPC,NLIMC + ENDIF +C + IF(N2.LE.NPNTC) THEN +C otherwise a simple change of dimension descriptors deletes the object + DO 30 I=1,NVECTC + DO 30 J=N2,NPNTC + VECTC(J-NPNTK,I)=VECTC(J,I) + 30 CONTINUE + DO 40 I=1,3 + IF(I.EQ.K.OR.NLIMC(1,I).LT.N2) GOTO 40 + NLIMC(1,I)=NLIMC(1,I)-NPNTK + IF(NLIMC(2,I).GT.0) NLIMC(2,I)=NLIMC(2,I)-NPNTK + 40 CONTINUE + ENDIF + NLIMC(1,K)=0 + NLIMC(2,K)=0 + NPC(K)=0 + NPNTC=NPNTC-NPNTK + RETURN + END +C + SUBROUTINE COARSE(PRINT6,PRINTFILE,NFILE,IS) +C --------------------------------------------- +C From the coarse map: NUMCOARSE, containig, for +C each fine surface element, the number of its +C coarse surf. elem., builts the coarse surf. elem. +C ------------------------------------------------ +C + PARAMETER (MAXPT=200000 , MAXBANDE=5 ) + PARAMETER (MAXPTC=50000 ) +C + COMMON /SURF/ NPNTMX,NPNT,NPNT1,NPNT2,NPNT3, + A N1I,N1F,N2I,N2F,N3I,N3F, + 1 X(MAXPT),Y(MAXPT),Z(MAXPT), + 2 G(MAXPT),GX(MAXPT),GY(MAXPT),GZ(MAXPT), + 3 FX(MAXPT),FY(MAXPT),FZ(MAXPT), + 4 TX(MAXPT),TY(MAXPT),TZ(MAXPT), + 5 T(MAXPT),A(MAXPT), + 6 FB(MAXPT),F(MAXPT,MAXBANDE),FRIFL(MAXPT), + 7 XLIMB(MAXPT),NUMOBJ(MAXPT),ALB(MAXPT), + 8 NUMCOARSE(MAXPT) + DIMENSION NP123(3) + DIMENSION NIF(2,3) + EQUIVALENCE (NP123(1),NPNT1),(NIF(1,1),N1I) +C + COMMON /SURFC/ NPNTMXC,NPNTC,NPNT1C,NPNT2C,NPNT3C, + A N1IC,N1FC,N2IC,N2FC,N3IC,N3FC, + 1 XC(MAXPTC),YC(MAXPTC),ZC(MAXPTC), + 2 GC(MAXPTC),GXC(MAXPTC),GYC(MAXPTC),GZC(MAXPTC), + 5 AC(MAXPTC), + 6 DIMCX(MAXPTC),DIMCY(MAXPTC),DIMCZ(MAXPTC), + 6 FBC(MAXPTC),FRIFLC(MAXPTC), + 7 XLIMBC(MAXPTC),NUMOBJC(MAXPTC),ALBC(MAXPTC), + 8 NUMFINI(MAXPTC) + DIMENSION NP123C(3) + DIMENSION NIFC(2,3) + EQUIVALENCE (NP123C(1),NPNT1C),(NIFC(1,1),N1IC) +C + LOGICAL PRINT6,PRINTFILE +C + N1=NIF(1,IS) + N2=NIF(2,IS) +C + N1C=NIFC(1,IS) + N2C=N1C+NP123C(IS)-1 +C Nifc(2,.)=0 when coarse map NUMCOARSE exist, but NOT surf.el. + NIFC(2,IS)=N2C +C + DO 10 I=N1C,N2C + XC(I)=0.0 + YC(I)=0.0 + ZC(I)=0.0 + GXC(I)=0.0 + GYC(I)=0.0 + GZC(I)=0.0 + AC(I)=0.0 + FBC(I)=0.0 + FRIFLC(I)=0.0 + XLIMBC(I)=0.0 + ALBC(I)=0.0 + DIMCX(I)=0.0 + DIMCY(I)=0.0 + DIMCZ(I)=0.0 + NUMFINI(I)=0 + NUMOBJC(I)=IS + 10 CONTINUE +C + DO 20 I=N1,N2 + K=NUMCOARSE(I) + IF(K.GT.N2C.OR.K.LT.N1C) THEN + WRITE(6,1000) I,NUMOBJ(I),K,IS + IF(PRINTFILE) WRITE(NFILE,1000) I,NUMOBJ(I),K,IS + 1000 FORMAT(/' ERROR! , surface element:',I6,' belonging to the' + 1 ' object:',I3/' assigned to coarse point:',I6, + 2 ' belonging to the wrong object:',I3) + GOTO 20 + ENDIF +C The coarse X,Y,Z etc are obtained by a weighted mean of +C their fine surf.interval (fine surf.el. areas are weights); +C to shorten the calculation you can simply sum The fine's x,y,z; +C then divide by NUMFINI. This could be a not too bad approximation. + NUMFINI(K)=NUMFINI(K)+1 + XC(K)=XC(K)+X(I) *A(I) + YC(K)=YC(K)+Y(I) *A(I) + ZC(K)=ZC(K)+Z(I) *A(I) + GXC(K)=GXC(K)+GX(I) *A(I) + GYC(K)=GYC(K)+GY(I) *A(I) + GZC(K)=GZC(K)+GZ(I) *A(I) + AC(K)=AC(K)+A(I) + FBC(K)=FBC(K)+FB(I) + XLIMBC(K)=XLIMBC(K)+XLIMB(I) *A(I) + ALBC(K)=ALBC(K)+ALB(I) *A(I) + DIMCX(K)=DIMCX(K)+ FX(I)+TX(I) + DIMCY(K)=DIMCY(K)+ FY(I)+TY(I) + DIMCZ(K)=DIMCZ(K)+ FZ(I)+TZ(I) + 20 CONTINUE +C + DO 30 I=N1C,N2C + XC(I)=XC(I) /AC(I) + YC(I)=YC(I) /AC(I) + ZC(I)=ZC(I) /AC(I) + GXC(I)=GXC(I)/AC(I) + GYC(I)=GYC(I)/AC(I) + GZC(I)=GZC(I)/AC(I) + XLIMBC(I)=XLIMBC(I)/AC(I) + ALBC(I)=ALBC(I) /AC(I) + 30 CONTINUE +C renormalizing G + DO 35 I=N1C,N2C + GC(I)=SQRT(GXC(I)*GXC(I)+GYC(I)*GYC(I)+GZC(I)*GZC(I)) + GXC(I)=GXC(I)/GC(I) + GYC(I)=GYC(I)/GC(I) + GZC(I)=GZC(I)/GC(I) + 35 CONTINUE +C + RETURN + END +C + SUBROUTINE CYL(PRINT6,PRINTFILE,NFILE,NRF,NTHF,NCORD,PKRI,NOBJ, + 1 NPUNT,NPUNTC,R,RI,H,HI,X0,Y0,Z0,ALZO,ROTAZ,R4PREC, + 2 NPNTMX,X,Y,Z,G,GX,GY,GZ,FX,FY,FZ,TX,TY,TZ,AREA,A,NUMCOARSE, + 3 NUMOBJ, R2,RR,RFACTOR,SINF,COSF) +C ---------------------------------------------------------------- +C Drawn a cylindrica surface, see sfera2 for general comments. +C NRF= number of fine r mesh in which R-RI is divided. +C NTHF= coarsing factor=number of fine for each coarse +C NRC= number of r coarse +C NFC= number of phi coarse (r dependent and >=4 ) +C After drawing on the plane x-y the cylinder can be rotated: +C ROTAZ= anti-clockwise angle of rotazion on the plane (x-x'angle) +C ALZO= clockwise rotation around the y' axis (z-z" angle) +C Ater the rotation the disk is shifted from (0,0,0) in (x0,y0,z0) +C +C NOBJ: number of this object, numobj(side surf.el)=nobj or nobj+3 +C if angle>r4prec ( to represent a concave obj. by two finctious ones, +C avoiding in this way disk transparency in luce1 ) +C ######## se si abbandona la simmetria di rotazione per il disco +C si devono aumentare il numero di oggetti che lo rappresentano, perche' +C non diventi trasparente ######################################## +C ---------------------------------------------------------------- + DIMENSION X(NPNTMX),Y(NPNTMX),Z(NPNTMX) + DIMENSION G(NPNTMX),GX(NPNTMX),GY(NPNTMX),GZ(NPNTMX) + DIMENSION FX(NPNTMX),FY(NPNTMX),FZ(NPNTMX) + DIMENSION TX(NPNTMX),TY(NPNTMX),TZ(NPNTMX) + DIMENSION A(NPNTMX) + DIMENSION NUMCOARSE(NPNTMX),NUMOBJ(NPNTMX) + DIMENSION R2(NTHF),RR(NTHF),RFACTOR(NTHF),SINF(NTHF),COSF(NTHF) + LOGICAL PRINTFILE,PRINT6 + DATA PI /3.1415926/ +C DATA PI /3.141592653589793/ +C REAL*8 PI +C + WIDTH5=(H-HI)*0.5 + HI2=HI*0.5 +C Disk thikening angle + ANGLE=ATAN2(WIDTH5,R-RI) + COSA=COS(ANGLE) + SINA=SIN(ANGLE) + IF(ABS(SINA).LT.R4PREC) SINA=0.0 + TANA=TAN(ANGLE) + IF(ABS(TANA).LT.R4PREC) TANA=0.0 + COSA1=1./COSA + NOBJ1=NOBJ + IF(ANGLE.GT.R4PREC) NOBJ1=NOBJ+3 +C +C Coarse mesh + NRC=NRF/NTHF + IF(MOD(NRF,NTHF).NE.0) THEN + WRITE(6,1000) NRF,NTHF + 1000 FORMAT(' ERROR! In drawing a cylinder the number of r mesh:', + 1 I5,' is not consistent with the coarsing factor:',I5) + ENDIF +C +C 1/cosa isn't included here: meshing is done on the disk central plane + DRC=(R-RI)/NRC + DRC5=DRC*0.5 +C fine r mesh + DRF=DRC/NTHF + DRF5=DRF*0.5 + DRF5TANA=DRF5*TANA +C +C NPUNTC will be incremented below. (NPUNTC is the first void coarse) +C IC is instead the actual coarse, or the last filled one. +C NPUNT is the number of surf.el. generated by this routine + IC=NPUNTC-2 + NPUNT=0 + AREA=0.0 +C +C ................... Coarse R loop ( from center RI to R) + DO 10 IRC=1,NRC + R1C=RI+(IRC-1)*DRC + R2C=R1C+DRC +C Number of phi coarse for this Radius + NFC=(2.*PI)*R2C/DRC + IF(NFC.LT.4) NFC=4 + DFC=(2.*PI)/NFC +C +C Radius fine for this R coarse + DUM=R1C + DO 15 I=1,NTHF + R1 =DUM + R2(I)=DUM+DRF + RR(I)=DUM+DRF5 + RFACTOR(I)=COSA1 * (R2(I)-R1)*(R2(I)+R1) + DUM=DUM+DRF + 15 CONTINUE +C +C ...................... PHI coarse loop + DO 10 IFC=1,NFC + F1C=(IFC-1)*DFC + F2C=F1C+DFC +C coarse surf.el. number + IC=IC+2 +C PHI fine interval + DFF=DFC/NTHF + DFF5=DFF*0.5 +C Cord, arch or tangent value for surf el. extension + IF(NCORD.EQ.2) THEN + SINF5=SIN(DFF5) + ELSE IF (NCORD.GE.3) THEN + TANF5=TAN(DFF5) + ENDIF +C +C First phi fine value fi coarse refers to the interval boundaries, +C fi fine is shifted at the interval center (+DFF5) + F=F1C-DFF5 +C sin and cos(f) values for this range if phi fine + DO 35 I=1,NTHF + F=F+DFF + COSF(I)=COS(F) + SINF(I)=SIN(F) + 35 CONTINUE +C +C .................... LOOP on phi fine interv. of coarse + DO 10 IFF=1,NTHF +C +C .................... LOOP on R fine interval of coarse + DO 10 IRF=1,NTHF +C + IF(NCORD.LE.1) THEN + CORDA=DFF5 * R2(IRF) + ELSE IF(NCORD.EQ.2) THEN + CORDA=SINF5 * R2(IRF) + ELSE + CORDA=TANF5 * R2(IRF) + ENDIF +C +C Upper surface point + IF(NPUNT.GE.NPNTMX) THEN + LOST=LOST+2 + GOTO 10 + ELSE + NPUNT=NPUNT+1 + ENDIF + X(NPUNT)= RR(IRF)*COSF(IFF) + Y(NPUNT)= RR(IRF)*SINF(IFF) + Z(NPUNT)= HI2 + RR(IRF)*TANA + GX(NPUNT)=-SINA*COSF(IFF) + GY(NPUNT)=-SINA*SINF(IFF) + GZ(NPUNT)= COSA + FX(NPUNT)=-CORDA*SINF(IFF) + FY(NPUNT)= CORDA*COSF(IFF) + FZ(NPUNT)=0. + TX(NPUNT)= DRF5*COSF(IFF) + TY(NPUNT)= DRF5*SINF(IFF) + TZ(NPUNT)= DRF5TANA + A(NPUNT)=DFF5*RFACTOR(IRF) + NUMCOARSE(NPUNT)=IC + NUMOBJ(NPUNT)=NOBJ +C area computation + AREA=A(NPUNT)+AREA +C +C Lower surface point + NPUNT1=NPUNT + NPUNT=NPUNT+1 + X(NPUNT)= X(NPUNT1) + Y(NPUNT)= Y(NPUNT1) + Z(NPUNT)=-Z(NPUNT1) + GX(NPUNT)= GX(NPUNT1) + GY(NPUNT)= GY(NPUNT1) + GZ(NPUNT)=-GZ(NPUNT1) + FX(NPUNT)=FX(NPUNT1) + FY(NPUNT)=FY(NPUNT1) + FZ(NPUNT)=0. + TX(NPUNT)= TX(NPUNT1) + TY(NPUNT)= TY(NPUNT1) + TZ(NPUNT)= TZ(NPUNT1) + A(NPUNT)=A(NPUNT1) + NUMCOARSE(NPUNT)=IC+1 + NUMOBJ(NPUNT)=NOBJ +C Total area computation + AREA=A(NPUNT)+AREA +C + 10 CONTINUE +C +C The IC+1 coarse has been filled by loop 10 + IC=IC+1 +C +C If this cylinder had a widht the side surface is drawn +C + IF(H.LE.R4PREC) GOTO 400 +C +C coarse and fine h and fi interval definition + NHC=INT(H/DRC) + IF(NHC.LE.0) NHC=1 + DHC=H/NHC + DHC5=DHC*0.5 + DHF=DHC/NTHF + DHF5=DHF*0.5 + NFC=(2.*PI)*R/DRC + IF(NFC.LT.4) NFC=4 + DFC=(2.*PI)/NFC + DFF=DFC/NTHF + DFF5=DFF*0.5 +C + IF(NCORD.LE.1) THEN + CORDA=R*DFF5 + ELSE IF(NCORD.EQ.2) THEN + CORDA=R*SIN(DFF5) + ELSE + CORDA=R*TAN(DFF5) + ENDIF +C + AREAR=R*DFF*DHF +C +C ........................ LOOP on phi coarse + DO 60 IFC=1,NFC + F1C=(IFC-1)*DFC +C sinf and cosf fine of this coarse + DUM=F1C-DFF5 + DO 65 I=1,NTHF + DUM=DUM+DFF + COSF(I)=COS(DUM) + SINF(I)=SIN(DUM) + 65 CONTINUE +C +C ....................... Loop on H coarse + DO 60 IHC=1,NHC +C lower z value (going from -H to (h-dhc)) + H1=-H*0.5-DHF5+(IHC-1)*DHC +C + IC=IC+1 +C +C ...................... LOOP on phi fine + DO 60 IFF=1,NTHF +C +C ........................ LOOP on H fine + DO 60 IHF=1,NTHF + HF=H1 + IHF*DHF +C + IF(NPUNT.GE.NPNTMX) THEN + LOST=LOST+1 + GOTO 60 + ELSE + NPUNT=NPUNT+1 + ENDIF + X(NPUNT)=R*COSF(IFF) + Y(NPUNT)=R*SINF(IFF) + Z(NPUNT)=HF + GX(NPUNT)=COSF(IFF) + GY(NPUNT)=SINF(IFF) + GZ(NPUNT)=0.0 + FX(NPUNT)=-CORDA*SINF(IFF) + FY(NPUNT)= CORDA*COSF(IFF) + FZ(NPUNT)=0. + TX(NPUNT)=0.0 + TY(NPUNT)=0.0 + TZ(NPUNT)= -DHF5 + A(NPUNT)=AREAR + NUMCOARSE(NPUNT)=IC + NUMOBJ(NPUNT)=NOBJ1 +C Total area computation + AREA=AREA + A(NPUNT) +C + 60 CONTINUE +C + 400 CONTINUE +C internal surface is drawn + IF(HI.LE.R4PREC.OR.RI.LE.R4PREC.OR.PKRI.LE.0) GOTO 500 +C +C coarse and fine height mesh + NHC=INT(HI/DRC) + IF(NHC.LE.0) NHC=1 + DHC=HI/NHC + DHC5=DHC*0.5 + DHF=DHC/NTHF + DHF5=DHF*0.5 +C phi coarse mesh + NFC=(2.*PI)*RI/DRC + IF(NFC.LT.4) NFC=4 + DFC=(2.*PI)/NFC + DFF=DFC/NTHF + DFF5=DFF*0.5 +C Area for each fine interval + AREAR=RI*DFF*DHF +C + IF(NCORD.LE.1) THEN + CORDA=RI*DFF5 + ELSE IF(NCORD.EQ.2) THEN + CORDA=RI*SIN(DFF5) + ELSE + CORDA=RI*TAN(DFF5) + ENDIF +C ........................ LOOP on phi coarse + DO 70 IFC=1,NFC + F1C=(IFC-1)*DFC +C sinf and cosf fine of this coarse + DUM=F1C-DFF5 + DO 75 I=1,NTHF + DUM=DUM+DFF + COSF(I)=COS(DUM) + SINF(I)=SIN(DUM) + 75 CONTINUE +C +C ....................... Loop on H coarse + DO 70 IHC=1,NHC +C lower z value (going from -Hi to (hi-dhc)) + H1=-HI*0.5-DHF5 + (IHC-1)*DHC +C + IC=IC+1 +C +C ...................... LOOP on phi fine + DO 70 IFF=1,NTHF +C +C ........................ LOOP on H fine + DO 70 IHF=1,NTHF + HF=H1+ IHF*DHF +C + IF(NPUNT.GE.NPNTMX) THEN + LOST=LOST+1 + GOTO 70 + ELSE + NPUNT=NPUNT+1 + ENDIF + X(NPUNT)=RI*COSF(IFF) + Y(NPUNT)=RI*SINF(IFF) + Z(NPUNT)=HF + GX(NPUNT)=COSF(IFF) + GY(NPUNT)=SINF(IFF) + GZ(NPUNT)=0.0 + FX(NPUNT)=-CORDA*SINF(IFF) + FY(NPUNT)= CORDA*COSF(IFF) + FZ(NPUNT)=0. + TX(NPUNT)=0.0 + TY(NPUNT)=0.0 + TZ(NPUNT)=DHF5 + A(NPUNT)=AREAR + NUMCOARSE(NPUNT)=IC + NUMOBJ(NPUNT)=NOBJ1 +C Total area computation + AREA=A(NPUNT)+AREA +C + 70 CONTINUE +C .................. END OF DISK SURFACE DRAWING ! + 500 CONTINUE + NPUNTC=IC+1 +C +C Constant potential USEFUL FOR DISK ? + DO 59 I=1,NPUNT + 59 G(I)=1. +C + IF(LOST.GT.0) THEN + WRITE(6,2000) NPUNT,LOST + IF(PRINTFILE) WRITE(NFILE,1000) NPUNT,LOST + 2000 FORMAT(' ERROR! In Cyl:OBJECT NOT PROPERLY DRAWN! '/ + 1 ' space available for only:',I6,' surface points.', + 2 ' lost points:',I6/ + 3 ' REDUCE THE NPHI PARAMETER OR GO INTO THE FORTRAN LIST TO', + 4 ' INCREASE MAXPT') + ENDIF +C +C ................ optional disk rotation ..... +C + IF(ALZO.EQ.0.0.AND.ROTAZ.EQ.0.0) GOTO 800 +C The disk is rotated by rotaz around the z axis (anti-clockwise) +C then around the new Y axis (clockwise) by alzo + COSP=COS(ROTAZ) + SINP=SIN(ROTAZ) + COSI=COS(ALZO) + SINI=SIN(ALZO) +C + IF(ABS(COSP).LT.R4PREC) COSP=0.0 + IF(ABS(SINP).LT.R4PREC) SINP=0.0 + IF(ABS(COSI).LT.R4PREC) COSI=0.0 + IF(ABS(SINI).LT.R4PREC) SINI=0.0 +C + DO 80 I=1,NPUNT + X1= X(I)* (COSP*COSI) + Y(I) * SINP - Z(I) * (COSP*SINI) + Y1=-X(I)* (SINP*COSI) + Y(I) * COSP + Z(I) * (SINP*SINI) + Z1= X(I)* SINI + Z(I) * COSI + X(I)=X1 + Y(I)=Y1 + Z(I)=Z1 + X1= GX(I)* (COSP*COSI) + GY(I) * SINP - GZ(I) * (COSP*SINI) + Y1=-GX(I)* (SINP*COSI) + GY(I) * COSP + GZ(I) * (SINP*SINI) + Z1= GX(I)* SINI + GZ(I) * COSI + GX(I)=X1 + GY(I)=Y1 + GZ(I)=Z1 + X1= TX(I)* (COSP*COSI) + TY(I) * SINP - TZ(I) * (COSP*SINI) + Y1=-TX(I)* (SINP*COSI) + TY(I) * COSP + TZ(I) * (SINP*SINI) + Z1= TX(I)* SINI + TZ(I) * COSI + TX(I)=X1 + TY(I)=Y1 + TZ(I)=Z1 + X1= FX(I)* (COSP*COSI) + FY(I) * SINP - FZ(I) * (COSP*SINI) + Y1=-FX(I)* (SINP*COSI) + FY(I) * COSP + FZ(I) * (SINP*SINI) + Z1= FX(I)* SINI + FZ(I) * COSI + FX(I)=X1 + FY(I)=Y1 + FZ(I)=Z1 +C + 80 CONTINUE +C + 800 CONTINUE +C shifting the disk from the origin=(0,0,0) to x0,y0,z0 + IF(X0.NE.0.0) THEN + DO 90 I=1,NPUNT + 90 X(I)=X(I)+X0 + ENDIF + IF(Y0.NE.0.0) THEN + DO 91 I=1,NPUNT + 91 Y(I)=Y(I)+Y0 + ENDIF + IF(Z0.NE.0.0) THEN + DO 92 I=1,NPUNT + 92 Z(I)=Z(I)+Z0 + ENDIF +C + RETURN + END +C + SUBROUTINE DOCELLS(N,D,DMIN,X,Y) +C ----------------------------------------- +C Computes the grid cell CENTERS for the +C projection plane +C ---------------------------------------- + DIMENSION X(N),Y(N) + DO 10 I=1,N + X(I)=(DMIN+D*0.5)+(I-1)*D + Y(I)=-X(I) + 10 CONTINUE + RETURN + END +C + SUBROUTINE FASGRID(N,FASE) +C ----------------------------------------------------- +C Defines an equispaced set of phases at which the +C light to observer will be computed +C ----------------------------------------------------- + DIMENSION FASE(N) + REAL*8 DEL + DEL=(6.283185307179586)/N + DO 10 I=1,N + 10 FASE(I)=DEL*(I-1) + RETURN + END +C + SUBROUTINE FASREAD(NFASI,NFILEF,NFILE,MAX,FASE) +C --------------------------------------------------- +C Reads fase values from unit NFILEF +C --------------------------------------------------- + DIMENSION FASE(MAX) + DATA PI2/6.2831853/ + DO 10 I=1,MAX + READ(NFILEF,*,END=500) FASE(I) + IF(FASE(I).LT.0.0.OR.FASE(I).GT.1.0) GOTO 500 + 10 CONTINUE + WRITE(6,1000)MAX,MAX + IF(NFILE.GT.0.AND.NFILE.LE.99)WRITE(NFILE,1000)MAX,MAX + 1000 FORMAT(' WARNING! You have reached the maximum number of', + 1 ' phases: ',I6/' If you need a grater value go into', + 2 ' the fortran list to change MAXFASI=',I6) + 500 CONTINUE + NFASI=I-1 + IF(NFASI.LE.0) THEN + WRITE(6,1001) NFILEF + IF(NFILE.GT.0.AND.NFILE.LE.99)WRITE(NFILE,1001)NFILEF + 1001 FORMAT(' ERROR! Zero phase values read from unit:',I5) + RETURN + ENDIF + DO 20 I=1,NFASI + 20 FASE(I)=FASE(I)*PI2 + RETURN + END +C + SUBROUTINE FILFILT +C ------------------------------------------------------ +C filling common /FILTRI/ with lambda and transmission +C factors for Johnson bands UBVRI . +C ( data from C.W.Allen - Astrophysical Quantities - +C Athone Press - London 1976 - pg.201 ) +C - - - - - - - - - - - - - - - - - - +C Lambda values must be equi-spaced +C - - - - - - - - - - - - - - - - - - +C Number of lambda values must be odd +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C PARAMETERS :=NU,NB,NV,NR,NI = num lambda for each filter,(<=MAXLAM) +C NLAMBDA(maxfilt)=NU,NB,NV,NR,NI = num lambda for each filter, +C NLAMBDA must be <= nfiltl +C DELTALAM= delta lambda for each filter +C U(nu),B(nb),..... are the light fraction tranmitted for lambdas +C in UL(nu),BL(nb) .... (in Anstrong ) , +C LAMBDA in common /filtri/ are Anstrong, +C ------------------------------------------------------ +C + PARAMETER (NU=9 , NB=11 , NV=13, NR=1, NI=1 ) +C + PARAMETER ( MAXFILT=5 , MAXLAM=15 ) + COMMON /FILTRI/ NFILT,NLAM, NLAMBDA(MAXFILT),DELTALAM(MAXLAM), + 1 ALAMBDA(MAXLAM,MAXFILT),TRASMISS(MAXLAM,MAXFILT), + 2 COMPFRAC(MAXLAM,3) +C + DIMENSION U(NU),B(NB),V(NV),R(NR),AI(NI) + DIMENSION UL(NU),BL(NB),VL(NV),RL(NR),AIL(NI) +C + DATA U/0.0,0.13,0.6,0.92,1.,0.72,0.07,0.0,0.0/ + DATA UL/2800.,3000.,3200.,3400.,3600.,3800.,4000.,4200.,4400./ + DATA B/0.0,0.13,0.92,1.00,0.92,0.76,0.56,0.39,0.2,0.07,0.0/ + DATA BL/3600.,3800.,4000.,4200.,4400.,4600.,4800.,5000., + 1 5200.,5400.,5600./ + DATA V/0.0,0.01,0.36,0.91,0.98,0.8,0.59,0.39,0.22,0.09, + 1 0.03,0.01,0.0/ + DATA VL/4600.,4800.,5000.,5200.,5400.,5600.,5800.,6000.,6200., + 1 6400.,6600.,6800.,7000./ +C +C NFILT=MAXFILT +C NLAM=MAXLAM +C +C Number of lambda for each band +C + NLAMBDA(1)=NU + NLAMBDA(2)=NB + NLAMBDA(3)=NV + NLAMBDA(4)=NR + NLAMBDA(5)=NI +C + DELTALAM(1)=200. + DELTALAM(2)=200. + DELTALAM(3)=200. + DELTALAM(4)=200. + DELTALAM(5)=200. +C +C ............................................................. +C Filling of common /filtri/ +C The following is not dependent on lambda and transmission +C ............................................................. +C +C following loop to avoid bad changes to this routine, +C by inexpert users inserting their preferred photometric bands. + DO 5 I=1,NFILT + IF(NLAMBDA(I).GT.NLAM) THEN + WRITE(6,1000) NLAMBDA(I),I,NLAM + 1000 FORMAT(' ERROR ! : WRONG CHANGE IN SUBROUTINE FILFILT'/ + 1 1X,I5,'=NUMBER OF LAMBDA FOR BAND',I2,' > MAXLAM=',I5) + NLAMBDA(I)=NLAM + ENDIF + 5 CONTINUE +C +C U - BAND - Filter 1 +C + DO 10 I=1,NU + ALAMBDA(I,1)=UL(I) + 10 TRASMISS(I,1)=U(I) +C +C +C B - BAND - Filter 2 +C + DO 20 I=1,NB + ALAMBDA(I,2)=BL(I) + 20 TRASMISS(I,2)=B(I) +C +C +C V - BAND - Filter 3 +C + DO 30 I=1,NV + ALAMBDA(I,3)=VL(I) + 30 TRASMISS(I,3)=V(I) +C +C +C R - BAND - Filter 4 +C + DO 40 I=1,NR + ALAMBDA(I,4)=RL(I) + 40 TRASMISS(I,4)=R(I) +C +C +C I - BAND - Filter 5 +C + DO 50 I=1,NI + ALAMBDA(I,5)=AIL(I) + 50 TRASMISS(I,5)=AI(I) +C + RETURN + END +C + SUBROUTINE FILL(N,A,B) +C ----------------------------- +C Fills B(i) with A +C ---------------------------- + DIMENSION B(N) + DO 10 I=1,N + 10 B(I)=A + RETURN + END +C + SUBROUTINE FILL1(N,A,B,C) +C ---------------------------- +C Fills B(i) with A*C(i) +C ---------------------------- + DIMENSION B(N),C(N) + DO 10 I=1,N + 10 B(I)=C(I)*A + RETURN + END +C + SUBROUTINE FINDALL(K1,K2,R4PREC) +C ---------------------------------------------- +C Finds allignement between the objects K1 and K2. +C An allignement is a straight line between a +C surface element in k1 and one in k2 which +C doesn't intersect the objects k1 or k2. +C This way of finding alignements doesn't work +C for complicated surfaces like ones with holes +C and mountains, but only when the outward normal +C line to a surface element never meets the surface: +C here a path between the two object is +C recognized as an alignement when the two surface +C elements at its ends look each other. +C +C Sin and cos < r4prec are assumed 0 ( sin,cos(0) is not precise) +C r4prec is inserted to avoiding double precision here. +C ---------------------------------------------- + PARAMETER (MAXPT=200000 ,MAXALLIN=250000, MAXBANDE=5) + PARAMETER (MAXPTC=50000) +C + COMMON /SURFC/ NPNTMXC,NPNTC,NPNT1C,NPNT2C,NPNT3C, + A N1IC,N1FC,N2IC,N2FC,N3IC,N3FC, + 1 XC(MAXPTC),YC(MAXPTC),ZC(MAXPTC), + 2 GC(MAXPTC),GXC(MAXPTC),GYC(MAXPTC),GZC(MAXPTC), + 5 AC(MAXPTC), + 6 DIMCX(MAXPTC),DIMCY(MAXPTC),DIMCZ(MAXPTC), + 6 FBC(MAXPTC),FRIFLC(MAXPTC), + 7 XLIMBC(MAXPTC),NUMOBJC(MAXPTC),ALBC(MAXPTC), + 8 NUMFINI(MAXPTC) + DIMENSION NP123C(3) + DIMENSION NIFC(2,3) + EQUIVALENCE (NP123C(1),NPNT1C),(NIFC(1,1),N1IC) +C +C + COMMON /ALLIN/ NALLMX,NALL,ITERDONE, + 1 ISOUR(MAXALLIN),JRIC(MAXALLIN), + 2 TRANSFI(MAXALLIN),TRANSFJ(MAXALLIN), + 3 FSOURI(MAXALLIN),FSOURJ(MAXALLIN), + 4 FRICI(MAXALLIN),FRICJ(MAXALLIN), + 5 RIJ(MAXALLIN), + 6 RXIJ(MAXALLIN),RYIJ(MAXALLIN),RZIJ(MAXALLIN), + 7 COSGI(MAXALLIN),COSGJ(MAXALLIN), + 8 IAUS(MAXALLIN) +C +C ................................................................ + N1=NIFC(1,K1) + N2=NIFC(2,K1) + N3=NIFC(1,K2) + N4=NIFC(2,K2) + LOST=0 +C looks for alignements +C ----------------------------------- LOOP BEGINS + DO 10 I=N1,N2 + DO 10 J=N3,N4 +C Vector joining the two surface elements (from I to J) + RIJX=XC(J)-XC(I) + RIJY=YC(J)-YC(I) + RIJZ=ZC(J)-ZC(I) +C surface normal in I projected along this vector + COSGI1=GXC(I)*RIJX+GYC(I)*RIJY+GZC(I)*RIJZ +C If < 0 the surface element I doesn't look toward J + IF (COSGI1.LE.R4PREC) GOTO 10 +C IF (COSGI1.LE.0.) GOTO 10 +C surface normal in J projected along vector from I to J + COSGJ1=GXC(J)*RIJX+GYC(J)*RIJY+GZC(J)*RIJZ +C If > 0 the surface element J doesn't look toward I + IF (COSGJ1.GE.-R4PREC) GOTO 10 +C IF (COSGJ1.GE.0.) GOTO 10 +C Here the path is recognized as an alignement +C Test if the alignement list is full. + IF(NALL.GT.NALLMX) THEN + LOST=LOST+1 + GOTO 10 + ENDIF +C Insert this path in the alignement list + NALL=NALL+1 + ISOUR(NALL)=I + JRIC(NALL)=J + RIJ(NALL)=RIJX*RIJX+RIJY*RIJY+RIJZ*RIJZ + RXIJ(NALL)=RIJX + RYIJ(NALL)=RIJY + RZIJ(NALL)=RIJZ + COSGI(NALL)=COSGI1 + COSGJ(NALL)=COSGJ1 + 10 CONTINUE +C ------------------------- LOOP ENDS + IF(LOST.GT.0) THEN + WRITE(6,1000) LOST + 1000 FORMAT(' ERROR: ',I6,' ALIGNEMENTS LOST IN REFLECTION '/ + 1 ' Reduce the number of surface elements or go into the'/ + 2 ' FORTRAN list to change parameter MAXALLIN') + ENDIF + RETURN + END +C + SUBROUTINE FINDCOMM(N1,N2,NAME,COMMAND,KF) +C ----------------------------------------------------- +C Looks for "COMMAND" in a list of NAMEs, +C Returns KF = position of COMMAND in vector NAME +C returns KF=0 if COMMAND isn't found in NAME vactor +C ----------------------------------------------------- + CHARACTER*(*) NAME(N2),COMMAND + DO 10 I=N1,N2 + IF(NAME(I).NE.COMMAND) GOTO 10 + KF=I + RETURN + 10 CONTINUE + KF=0 + RETURN + END +C + SUBROUTINE FINEFRIFL +C ------------------------------------------------ +C From coarse grid surface elements reflection source +C computes fine grid surf. elem. rreflect. source +C --------------------------------------------------- +C + PARAMETER (MAXPT=200000 , MAXBANDE=5 ) + PARAMETER (MAXPTC=50000 ) +C + COMMON /SURF/ NPNTMX,NPNT,NPNT1,NPNT2,NPNT3, + A N1I,N1F,N2I,N2F,N3I,N3F, + 1 X(MAXPT),Y(MAXPT),Z(MAXPT), + 2 G(MAXPT),GX(MAXPT),GY(MAXPT),GZ(MAXPT), + 3 FX(MAXPT),FY(MAXPT),FZ(MAXPT), + 4 TX(MAXPT),TY(MAXPT),TZ(MAXPT), + 5 T(MAXPT),A(MAXPT), + 6 FB(MAXPT),F(MAXPT,MAXBANDE),FRIFL(MAXPT), + 7 XLIMB(MAXPT),NUMOBJ(MAXPT),ALB(MAXPT), + 8 NUMCOARSE(MAXPT) + DIMENSION NP123(3) + DIMENSION NIF(2,3) + EQUIVALENCE (NP123(1),NPNT1),(NIF(1,1),N1I) +C + COMMON /SURFC/ NPNTMXC,NPNTC,NPNT1C,NPNT2C,NPNT3C, + A N1IC,N1FC,N2IC,N2FC,N3IC,N3FC, + 1 XC(MAXPTC),YC(MAXPTC),ZC(MAXPTC), + 2 GC(MAXPTC),GXC(MAXPTC),GYC(MAXPTC),GZC(MAXPTC), + 5 AC(MAXPTC), + 6 DIMCX(MAXPTC),DIMCY(MAXPTC),DIMCZ(MAXPTC), + 6 FBC(MAXPTC),FRIFLC(MAXPTC), + 7 XLIMBC(MAXPTC),NUMOBJC(MAXPTC),ALBC(MAXPTC), + 8 NUMFINI(MAXPTC) + DIMENSION NP123C(3) + DIMENSION NIFC(2,3) + EQUIVALENCE (NP123C(1),NPNT1C),(NIFC(1,1),N1IC) +C + DO 10 I=1,NPNT + K=NUMCOARSE(I) + IF(FRIFLC(K).LE.0.0) THEN + FRIFL(I)=0.0 + ELSE + FRIFL(I)=A(I)/AC(K)*FRIFLC(K) + ENDIF + 10 CONTINUE + RETURN + END +C + SUBROUTINE GRADOMEGA(X,Y,Z,GX,GY,GZ,G,Q) +C --------------------------------------------------- +C Used by subr. Roches : normalized omega gradient +C --------------------------------------------------- + SQ =1./(X*X+Y*Y+Z*Z)**1.5 + SQ1=1./((1.-X)*(1.-X)+Y*Y+Z*Z)**1.5 + A= SQ+SQ1*Q + B= A -1.-Q + GX= X * B + Q * (1.-SQ1) + GY= Y * B + GZ= Z * A + G=SQRT(GX*GX+GY*GY+GZ*GZ) + GX=GX/G + GY=GY/G + GZ=GZ/G + RETURN + END +C + SUBROUTINE GRAVITY1(KK,NPNT,BETA,TINPUT,G,T) +C ------------------------------------------------- +C Compute the star surface temperature variation +C due to the different gravity. (gravity darkening) +C BETA is the gravity darkening exponent +C TINPUT the max surface temperature of the star +C as given in input.(= pole temperature) +C ------------------------------------------------- + DIMENSION G(NPNT),T(NPNT) +C +C Temperature profile computation +C and max temperature of the computed profile + T(1)=1. + TMAX=1. + KK=1 + DO 10 I=2,NPNT + T(I)=(G(I)/G(1))**BETA + IF(T(I).GT.TMAX) THEN + TMAX=T(I) + KK=I + ENDIF + 10 CONTINUE +C Renormalizes the temp. profile to give the input medium temp. + DO 20 I=1,NPNT + T(I)=(TINPUT/TMAX)*T(I) + 20 CONTINUE + RETURN + END +C + SUBROUTINE INPUT(NAMFLAG,DESCFLAG,IFLAGDEF,NAMPAR,DESCPAR, + 1 PARDEF,IPPAR1,IPPAR2,STOP) +C ------------------------------------------------------------ +C Reads input and sets flags and parameters +C ------------------------------------------------------------ + PARAMETER (MAXFLAG=21 , MAXPAR=128 , MAXPARS=20 ) + PARAMETER (MAXTITLE=5) + DIMENSION IPPAR1(MAXFLAG),IPPAR2(MAXFLAG),MODFLAG(MAXFLAG) + DIMENSION IFLAGDEF(MAXFLAG),PARDEF(MAXPAR) + CHARACTER *10 NAMFLAG(MAXFLAG) + CHARACTER *20 DESCFLAG(MAXFLAG) + CHARACTER *10 NAMPAR(MAXPAR) + CHARACTER *20 DESCPAR(MAXPAR) + LOGICAL STOP +C + CHARACTER*80 COMMAND,COMMAND1 + CHARACTER PROMPT *15, PROMPT1 *20 + DATA PROMPT,PROMPT1/' INPUT FLAG >',' INPUT PARAMETER >'/ +C + COMMON /PAR/ NFLAG,IFLAG(MAXFLAG),NPAR,PAR(MAXPAR) +C DIMENSION PARS(MAXPARS,3) +C EQUIVALENCE (PARS(1,1),PAR(1)) + COMMON/TITLE/NTITLEMX,NTITLE,TITLE(MAXTITLE) + CHARACTER*80 TITLE +C +C ------------------------------------------------ INPUT FLAG LOOP + GOTO 12 +C ........................... Loop entry for input: "?" + 8 CALL ASKI(1,NFLAG,NAMFLAG,DESCFLAG,IFLAG) + GOTO 12 +C ........................... Loop entry for bad command + 10 WRITE(6,1000) COMMAND +1000 FORMAT(' FLAG NAME NOT RECOGNIZED: ',A10,' Please reenter') +C ........................... Loop entry for normal reading + 12 CALL UPPERC(COMMAND,PROMPT,KFLU) +C If input "?" loops again + IF(KFLU.NE.0) GOTO 8 +C Looks for flag name + CALL FINDCOMM(1,NFLAG,NAMFLAG,COMMAND,KFL) +C If name not found loops again + IF(KFL.LE.0.OR.KFL.GT.NFLAG) GOTO 10 +C If iflag(19)=1 set flag off + IF(IFLAG(19).EQ.1) THEN + IFLAG(KFL)=0 + WRITE(6,1100) KFL,NAMFLAG(KFL),DESCFLAG(KFL) + 1100 FORMAT(' Set off: flag number:',I5,5x,A10,2X,A20) + GOTO 12 + ENDIF +C Otherwise set flag on +C (16 is the entry from parameter loop) + 16 IFLAG(KFL)=1 + WRITE(6,1110) KFL,NAMFLAG(KFL),DESCFLAG(KFL) + 1110 FORMAT(' Set on: flag number:',I5,5x,A10,2X,A20) +C Exits from input loops + IF(IFLAG(15).EQ.1) GOTO 300 + IF(IFLAG(16).EQ.1.OR.IFLAG(17).EQ.1) GOTO 500 +C If there aren't flag's parameters loops again + IF(IPPAR1(KFL).LE.0) GOTO 12 +C +C ------------------------------------------ INPUT PARAMETERS LOOP + GOTO 22 +C ........................... Loop entry for input: "?" + 18 CALL ASK(IPPAR1(KFL),IPPAR2(KFL),NAMPAR,DESCPAR,PAR) + GOTO 22 +C ........................... Loop entry for bad command + 20 WRITE(6,2000) COMMAND1 +2000 FORMAT(' PARAMETER NOT RECOGNIZED: ',A10,' Please reenter') +C ........................... Loop entry for normal reading + 22 CALL UPPERC(COMMAND1,PROMPT1,KFLU1) +C If input "?" loops again + IF(KFLU1.NE.0) GOTO 18 +C Looks for parameter name + CALL FINDCOMM(IPPAR1(KFL),IPPAR2(KFL),NAMPAR,COMMAND1,KFL1) +C If name is found sets its value + IF(KFL1.GE.IPPAR1(KFL).AND.KFL1.LE.IPPAR2(KFL)) THEN + GOTO 24 + 23 WRITE(6,2001) + 2001 FORMAT(' INPUT ERROR! REENTER') + 24 WRITE(6,2002) +C Following format is not ANSI standard + 2002 FORMAT(' VALUE > ',$) + READ(5,*,ERR=23,END=23) COMM + 2003 FORMAT(E20.0) + PAR(KFL1)=COMM + WRITE(6,2100) KFL1,NAMPAR(KFL1),DESCPAR(KFL1),PAR(KFL1) + 2100 FORMAT(' Parameter number:',I5,5x,A10,2X,A20,' = ',G15.7) + ELSE +C If not found tests if it's a flag + CALL FINDCOMM(1,NFLAG,NAMFLAG,COMMAND1,KFL2) +C Not being a flag loops again + IF(KFL2.LE.0.OR.KFL2.GT.NFLAG) GOTO 20 +C Otherwise goes to flag loop + KFL=KFL2 + GOTO 16 + ENDIF + GOTO 22 +C ------------------------------------------ END OF PARAMETER LOOP +C ------------------------------------------ END OF FLAG LOOP +C + 300 STOP=.FALSE. + RETURN + 500 STOP=.TRUE. + RETURN + END +C + SUBROUTINE INULL(N,IA) +C ----------------------- +C Fills IA with 0 . +C Depending on computers, +C NULL could be also used. +C ---------------------- + DIMENSION IA(N) + DO 10 I=1,N + 10 IA(I)=0 + RETURN + END +C + SUBROUTINE LAGR(Q,PRECISION) +C --------------------------------------------------------- +C Lagrange point computation for the mass ratio Q +C the distance between the two body is the measure unit(=1) +C PRECISION = accurancy of Newton-Rapson algorithm, +C remember that you need 1.E-7 to have all the 7 digits of a real*4 number +C --------------------------------------------------------- + COMMON /ROCHE/ AL1,AL2,AL3,XA1,XA2,XB1,XB2,YA,YB, + 1 OMEGAL1,OMEGAL2,OMEGAL3, + 2 RPOLE(3),XPOLE(3),YPOLE(3),ZPOLE(3),TPOLE(3), + 3 GXPOLE(3),GYPOLE(3),GZPOLE(3) +C + EXTERNAL LAGRF1,LAGRF2,LAGRF3 + OM(Q,XV)=1./ABS(XV)+Q/ABS(1.-XV)+(1.+Q)/2.*XV*XV-Q*XV +C +C Initial values ( used if the computation below doesn't succeed) +C + AL1=0.0 + AL2=0.0 + AL3=0.0 +C Approx transv. dimension for critical lobes(Plavec BAC,15:165(64)) +C Plavec formula assume q<1 : + IF(Q.LE.1) THEN + ALOGQ=LOG10(Q) + ELSE + ALOGQ=LOG10(1./Q) + ENDIF +C + YA=10**(-0.4221-0.2084*ALOGQ) + YB=10**(-0.4236+0.2743*ALOGQ) +C Lagrange points: Inner point L1 +C L2 (near minor body) R1,R2 are search limits for rtsafe routine +C L3 (near major body ) + NERROR=0 + R1=0.0 + R2=1.0 + AL1=RTSAFE(LAGRF1,R1,R2,PRECISION,Q,DUM,NERROR) + OMEGAL1=OM(Q,AL1) + R1=1. + R2=2. + AL2=RTSAFE(LAGRF2,R1,R2,PRECISION,Q,DUM,NERROR) + OMEGAL2=OM(Q,AL2) + R1=-1. + R2=0. + AL3=RTSAFE(LAGRF3,R1,R2,PRECISION,Q,DUM,NERROR) + OMEGAL3=OM(Q,AL3) +C + IF(NERROR.GT.0) THEN + WRITE(6,1000) + 1000 FORMAT(/' ERROR In subr. LAGR, Incorrect Lagrange Points') + ENDIF + RETURN + END +C + FUNCTION LAGRF1(X,F,DF,Q,DUM) +C ----------------------------------------------------------------- +C Intersection x-axis <-> roche lobes for a given Q, called by LAGR +C near L1 point +C ----------------------------------------------------------------- +C F= X**5*(1.+Q)- X**4*(2.+3.*Q)+X**3*(1.+3.*Q)-X**2+X*2.-1. +C DF=5.*X**4*(1.+Q)-4.*X**3*(2.+3.*Q)+3.*X**2*(1.+3.*Q)-2.*X +2. + Q1=1.+Q + QXQ=X*Q1-Q + QXQ2=2.*QXQ + RX=1.-X + RX2=RX*RX + X2=X*X + F=RX2 *( X2 * QXQ -1. ) + X2*Q + DF= RX* ( RX* X* (QXQ2 + X*Q1) - X * (X*QXQ2) -2. ) +2.*X*Q + RETURN + END +C + FUNCTION LAGRF2(X,F,DF,Q,DUM) +C ----------------------------------------------------------------- +C Intersection x-axis <-> roche lobes for a given Q, called by LAGR +C near L2 point +C ----------------------------------------------------------------- + Q1=1.+Q + QXQ=X*Q1-Q + QXQ2=2.*QXQ + RX=X-1. + RX2=RX*RX + X2=X*X + F=RX2 *( X2 * QXQ -1. ) - X2*Q + DF= RX* ( RX* X* (QXQ2 + X*Q1) + X * (X*QXQ2) -2. ) -2.*X*Q + RETURN + END +C + FUNCTION LAGRF3(X,F,DF,Q,DUM) +C ----------------------------------------------------------------- +C Intersection x-axis <-> roche lobes for a given Q, called by LAGR +C near L3 point +C ----------------------------------------------------------------- + Q1=1.+Q + QXQ=X*Q1-Q + QXQ2=2.*QXQ + RX=1.-X + RX2=RX*RX + X2=X*X + F=RX2 *( X2 * QXQ +1. ) + X2*Q + DF= RX* ( RX* X* (QXQ2 + X*Q1) + X * (X*QXQ2) +2. ) +2.*X*Q + RETURN + END +C + SUBROUTINE LBOLT(NPNT,F,T,A) +C ----------------------------------------------------------- +C This routine computes the bolometric flux integrated over +C each surface element, assuming a black body emission +C flux=erg/cm**2/sec/sterad .=caT**4/(4 PI) +C F=FLUX*AREA=erg/sec/sterad +C we could set, to shorten calculation: flux=T**4, being a*c/(4*pi)=1. +C ----------------------------------------------------------- + DIMENSION F(NPNT),T(NPNT),A(NPNT) + PARAMETER ( AC4PI=7.567E-15 *3.E10/4./3.1415926 ) + DO 10 I=1,NPNT + F(I)=T(I)**4*A(I) * AC4PI + 10 CONTINUE + RETURN + END +C + SUBROUTINE LIMB(N,D,A,T,XLIMB,ALB) +C ----------------------------------------------- +C D is the input given limb darkening; A the albedo +C A time dependece could be inserted here, +C but now this is the same as the Fill routine. +C ----------------------------------------------- + DIMENSION T(N),XLIMB(N),ALB(N) + DO 10 I=1,N + ALB(I)=A + 10 XLIMB(I)=D + RETURN + END +C + SUBROUTINE LOBES(Q,PRECISION,OMEGA,R,IS) +C ----------------------------------------------------------------- +C Given Q and a potential value (omega), computes the +C Intersections of the x-axis with Roche lobes with potential OMEGA +C and mass ratio Q : IS=1 for the major star, 2 for the minor one +C If Omega is not given (<= 0.0) then it is deduced from R : +C intersection of lobe and X axis +C Precision= precision in Newton-Cotes routine. 1.E-7 to give all the 7 +C digits of a real*4 number +C ----------------------------------------------------------------- + COMMON/ROCHE/ AL1,AL2,AL3,XA1,XA2,XB1,XB2,YA,YB, + 1 OMEGAL1,OMEGAL2,OMEGAL3, + 2 RPOLE(3),XPOLE(3),YPOLE(3),ZPOLE(3),TPOLE(3), + 3 GXPOLE(3),GYPOLE(3),GZPOLE(3) + EXTERNAL LOBESF1,LOBESF2,LOBESF3 + LOGICAL PRIMO +C +C OM(Q,XV)=1./XV+Q/(1.-XV)+(1.+Q)/2.*XV*XV-Q*XV+Q*Q/2./(1.+Q) old omega def. + OM(Q,XV)=1./ABS(XV)+Q/ABS(1.-XV)+(1.+Q)/2.*XV*XV-Q*XV +C + PRIMO=.TRUE. + IF(IS.EQ.3) THEN + WRITE(6,1000) + 1000 FORMAT(' ERROR ! In subroutine LOBES: object 3 can''t be a', + 1 ' Roche model star!') + RETURN + ENDIF +C + 10 IF(OMEGA.LE.0.0) THEN + WRITE(6,2000) R + 2000 FORMAT(' WARNING ! : Subr.Lobes computes Omega from R:', + 1 G15.7/' R is intended as the lobe radius at the ', + 2 ' intersection with x axis, near L1' ) + IF(R.LE.0..OR.R.GT.1.0) THEN + IF(IS.EQ.1) THEN + WRITE(6,2010) R,AL1 + R=AL1 + ELSE + WRITE(6,2010) R,1.-AL1 + R=1.-AL1 + ENDIF + 2010 FORMAT(' WARNING ! : Incorrect R :',G14.7, + 1 ' Setting critical lobe: R=',G14.7) + ENDIF + IF(IS.EQ.1.) THEN + OMEGA=OM(Q,R) + ELSE + OMEGA=OM(Q,1.-R) + ENDIF + WRITE(6,2020) OMEGA + 2020 FORMAT(' I set OMEGA=',G15.7) + PRIMO=.FALSE. + ENDIF +C R1,R2 =bounds for searching the inner lobe intersection +C R3,R4 for outher lobe intersetion +C For major star: + IF(IS.EQ.1) THEN + 20 R1=0.0 + R2=AL1 + R3=-AL1 + R4=0. +C Error counter : + NERROR=0 + XA1=RTSAFE(LOBESF1,R1,R2,PRECISION,Q,OMEGA,NERROR) + XA2=RTSAFE(LOBESF3,R3,R4,PRECISION,Q,OMEGA,NERROR) +C +C Error recovery: 1: try to compute omega from R ( if not done) +C 2: set R=critical lobe dimension (if not done) +C 3: as 2 and guess values for XA1,XA2=star bounds + IF(NERROR.GT.0.OR.XA1.GT.AL1.OR.XA2.LT.AL3) THEN + WRITE(6,3000) IS + 3000 FORMAT(' ERROR ! wrong Q or OMEGA ; object:',I3) + WRITE(6,4000)AL1,AL2,AL3,XA1,XA2,OMEGA + 4000 FORMAT(' Lagrange points:',3G15.7/ + 1 ' Surf.- X axis intersections:',2G14.7,' Omega:',G14.7) +C + IF(PRIMO) THEN + IF(R.LE.0.) THEN + WRITE(6,2010) R,AL1 + R=AL1 + ENDIF + OMEGA=OM(Q,R) + WRITE(6,2000) R + WRITE(6,2020) OMEGA + PRIMO=.FALSE. + GOTO 20 + ELSE IF(R.NE.AL1) THEN + WRITE(6,2010) R,AL1 + R=AL1 + OMEGA=OM(Q,R) + WRITE(6,2000) R + WRITE(6,2020) OMEGA + GOTO 20 + ELSE + WRITE(6,5000) XA1,XA2,AL1 + 5000 FORMAT(' ERROR RECOVERY NOT POSSIBLE:', + 1 ' wrong intersections:',2G15.7/ + 2 ' used L1:',G14.7) + XA1=AL1 + XA2=-AL1 + ENDIF + ENDIF + ELSE +C Minor star + 30 R1=AL1 + R2=1. + R3=1. + R4=AL2 +C Error counter reset + NERROR=0 + XB1=RTSAFE(LOBESF1,R1,R2,PRECISION,Q,OMEGA,NERROR) + XB2=RTSAFE(LOBESF2,R3,R4,PRECISION,Q,OMEGA,NERROR) +C Error recovery + IF(NERROR.GT.0.OR.XB1.LT.AL1.OR.XB2.GT.AL2) THEN + WRITE(6,3000) IS + WRITE(6,4000)AL1,AL2,AL3,XB1,XB2,OMEGA +C + IF(PRIMO) THEN + IF(R.LE.0.) THEN + WRITE(6,2010) R,1.-AL1 + R=1.-AL1 + ENDIF + OMEGA=OM(Q,1.-R) + WRITE(6,2000)R + WRITE(6,2020) OMEGA + PRIMO=.FALSE. + GOTO 30 + ELSE IF(R.NE.1.-AL1) THEN + WRITE(6,2010) R,1.-AL1 + R=1.-AL1 + OMEGA=OM(Q,AL1) + WRITE(6,2000)R + WRITE(6,2020) OMEGA + GOTO 20 + ELSE + WRITE(6,5000) XB1,XB2,AL1 + XB1=AL1 + XB2=1.+AL1 + ENDIF + ENDIF + ENDIF + RETURN + END +C + SUBROUTINE LOBESF1(X,F,DF,Q,OMEGA) +C ------------------------------------------------ +C used by lobes : intersection of roche lobe +C and X axis near L1 for a given omega and q +C ------------------------------------------------ + A=(1.+Q)/2. + B=A+Q +C C=OMEGA-Q- (Q**2/2./(1.+Q)) old omega definition +C D=Q-1.-OMEGA+(Q**2/2./(1.+Q)) + C=OMEGA-Q + D=Q-1.-OMEGA + F=-A*X**4+B*X**3+C*X**2+D*X+1. + DF=-4.*A*X**3+3.*X**2*B+2.*C*X+D + RETURN + END +C + SUBROUTINE LOBESF2(X,F,DF,Q,OMEGA) +C ------------------------------------------------ +C used by lobes : intersection of roche lobe +C and X axis near L2(after star B)for a given omega and q +C ------------------------------------------------ + A=(1.+Q)/2. + B=A+Q +C C=OMEGA-Q- (Q**2/2./(1.+Q)) old omega definition +C D= - Q-1.-OMEGA+(Q**2/2./(1.+Q)) + C=OMEGA-Q + D= - Q-1.-OMEGA + F=-A*X**4+B*X**3+C*X**2+D*X+1. + DF=-4.*A*X**3+3.*X**2*B+2.*C*X+D + RETURN + END +C + SUBROUTINE LOBESF3(X,F,DF,Q,OMEGA) +C ------------------------------------------------ +C used by lobes : intersection of roche lobe +C and X axis near L3(before star A)for a given omega and q +C ------------------------------------------------ + A=(1.+Q)/2. + B=A+Q +C C=OMEGA-Q- (Q**2/2./(1.+Q)) old omega definition +C D=Q+1.-OMEGA+(Q**2/2./(1.+Q)) + C=OMEGA-Q + D=Q+1.-OMEGA + F=-A*X**4+B*X**3+C*X**2+D*X -1. + DF=-4.*A*X**3+3.*X**2*B+2.*C*X+D + RETURN + END +C + SUBROUTINE LUCE1(NPRINT,PRINT6,PRINTFILE,NFILE,NPRINTL, + 1 COSI,SINI,R4PREC,CELLMAX,CELLMIN,DCELL,NCELL, + 2 XCELL,YCELL,ICELL,COSG,NEXT,ILOST,IGAINED,IBAND) +C ------------------------------------------------------------ +C This routine computes the light received by the observer +C at each phase. The image of the system is projected +C onto a plane perpendicular to the observer at each phase. +C This plane is divided into a number of grid points. +C Two special cases are to be considered: +C a) overfill case: more surf. elements of the same object +C fall into the same grid cell,( this happens at the +C star disk boundary); in this case a linklist is +C constructed with these points. +C b) underfill case: a surface element's projection is greater +C than the cell dimension. To account for this the projected +C surf.el. boundary are computed and the surf.el. is expanded +C over its cells on the grid. +C If two surface elements of different objects falls into the +C same cell, the further's light is decreased by the cell contribution, +C the part of its light falling into the cell being eclipsed. +C +C Finally, an integration over the perpendicular plane gives +C the total received light for the phase. +C +C COS < R4PREC is assumed 0, this shorten alittle bit the computations, +C by eliminating uneffective points, seen side-face. Points at 90 degrees +C are made visible by rounding errors in cos(about 90) whitout this trick. +C +C XCELL,YCELL are the center of the cells, used only for printing +C The projection reference system is LEFT-HANDED (for better +C vision of objects on the screen),the other systems are right-handed! +C YCELL is built in DOCELLS going from ymax to -ymax, +C making apparence of the printed projection plane right-handed again. +C #################################### NOTA ################# +C La distanza dall'osservatore e' ricalcolata ogni volta; +C tenerla in un vettore dist risparmia di doverla ricalcolare quando +C serve, ma ogni volta che si deve usare si deve fare un if per vedere +C se e' gia' calcolata oppure si deve calcolare. Per questo l'uso +C di dist va provato in vari casi, per vedere se conviene. +C ############################################################# +C +C PRINTFILE : if true can print information on unit NFILE on each +C NPRINT phase steps; NPRINTL defines the amount of printing +C PRINT6 : if true some log printing on unit 6 +C ------------------------------------------------------------- + PARAMETER (MAXPT=200000 , MAXFASI=1000, MAXBANDE=5) +C + COMMON /SURF/ NPNTMX,NPNT,NPNT1,NPNT2,NPNT3, + A N1I,N1F,N2I,N2F,N3I,N3F, + 1 X(MAXPT),Y(MAXPT),Z(MAXPT), + 2 G(MAXPT),GX(MAXPT),GY(MAXPT),GZ(MAXPT), + 3 FX(MAXPT),FY(MAXPT),FZ(MAXPT), + 4 TX(MAXPT),TY(MAXPT),TZ(MAXPT), + 5 T(MAXPT),A(MAXPT), + 6 FB(MAXPT),F(MAXPT,MAXBANDE),FRIFL(MAXPT), + 7 XLIMB(MAXPT),NUMOBJ(MAXPT),ALB(MAXPT), + 8 NUMCOARSE(MAXPT) + DIMENSION NP123(3) + DIMENSION NIF(2,3) + EQUIVALENCE (NP123(1),NPNT1),(NIF(1,1),N1I) +C + COMMON /LIGHT/ NFASIMX,NFASI,NBANDE, + 1 FASE(MAXFASI),O(MAXBANDE,MAXFASI), + 2 C(3,MAXBANDE,MAXFASI),CT(MAXBANDE,MAXFASI), + 3 CBOL(3,MAXFASI),CBOLT(MAXFASI), + 4 CBOLR(3,MAXFASI),CBOLTR(MAXFASI), + 5 AREA(3),FBOLTOT(3),FBOL(3),FBOLREF(3) +C + DIMENSION XCELL(NCELL),YCELL(NCELL),ICELL(NCELL,NCELL) +C + DIMENSION IBAND(MAXBANDE) + DIMENSION COSG(MAXPT),NEXT(MAXPT),IGAINED(MAXPT),ILOST(MAXPT) +C Print buffer, used to store data to be printed in the same line + PARAMETER (MAXBUF=20) + DIMENSION NBUF(MAXBUF) + LOGICAL PRINTFILE,PRINT6 + DIMENSION XESP12(4) + EQUIVALENCE (XESP1,XESP12(1)),(XESP2,XESP12(2)) + EQUIVALENCE (XESP3,XESP12(3)),(XESP4,XESP12(4)) +C ............................................................ + CALL NULL(MAXBANDE*MAXFASI*3,C) + CALL NULL(MAXBANDE*MAXFASI,CT) + CALL NULL(MAXFASI*3,CBOL) + CALL NULL(MAXFASI,CBOLT) + CALL NULL(MAXFASI*3,CBOLR) + CALL NULL(MAXFASI,CBOLTR) +C ------------------------------------- Loop on phases + IF(PRINT6) TEMPO0=SECNDS(0.0) + DO 10 IF=1,NFASI +C ................. time printing for previous phase + IF(PRINT6) THEN + TEMPO2=SECNDS(TEMPO0) + WRITE(6,8999) IF,FASE(IF),TEMPO2 + TEMPO0=TEMPO0+TEMPO2 + 8999 FORMAT(' Sub.LUCE1: beginning phase:',I5,' : ',G12.5, + 1 ' elapsed time for last phase:',G15.7) + ENDIF +C .................. counters for statistic +C ######### poi da eliminare, sprecano tempo! ############ + NCOUNTS=0 ! considered surf. el. + NCOUNTL=0 ! surf. el put in link list + NCOUNTE=0 ! cell expansions + NCOUNTV=0 ! " " over void cells + NCOUNTD=0 ! " " over different object's + NCOUNTD1=0 ! " " (of which eclipsing) + NCOUNTD2=0 ! " " (of which eclipsed ) + NCOUNTF=0 ! " " over same object's + NCOUNTT=0 ! total remaining surf points + NCOUNTTL=0 ! remaining surf points in link lists + NCOUNTL1=0 ! number of remaining link lists +C + COSF=COS(FASE(IF)) + SINF=SIN(FASE(IF)) +C Components of the unit vector toward the observer Z0 +C and of unit vectors of the perpendicular plane X0,Y0 +C X0,Y0,Z0 = Y , -Z , X to make printing easier and nicer. +C In this way we have a left-handed projection reference system +C and a right-handed object reference system, +C but, when printing the projection plane, the Y coordinate +C is printed as -Y, making this printing right-handed again. + Y0X=COSI*COSF + Y0Y=-COSI*SINF + Y0Z=-SINI + X0X=SINF + X0Y=COSF + X0Z=0.0 + Z0X=COSF*SINI + Z0Y=-SINF*SINI + Z0Z=COSI +C +C tempo=secnds(0.0) + CALL INULL(NCELL*NCELL,ICELL) +C tempo1=secnds(tempo) +C write(6,9000) if,tempo1 +C if(printfile) write(nfile,9000) if,tempo1 + 9000 format(' Sub.luce1: phase:',I5, + 1 ' elapsed time for grid initialization:',G15.7) +C +C ------------------------------------ Loop on surface elements + LOST=0 + DO 30 I=1,NPNT +C Number of cells covered by the surf. elem. + IGAINED(I)=0 +C normal to the surface element projected toward the observer + DUM = Z0X*GX(I)+Z0Y*GY(I)+Z0Z*GZ(I) +C Skips the element if it doesn't look toward the observer + IF(DUM.LE.R4PREC) GOTO 30 +C + NCOUNTS=NCOUNTS+1 + COSG(I)=DUM + NEXT(I)=0 +C Number of cells covered by the object, but lost being eclipsed + ILOST(I)=0 +C +C Looks for the point of the plane in which the element falls +C In the following statement X0z=0. CAN BE is assumed #### + XX0=X(I)*X0X+Y(I)*X0Y+Z(I)*X0Z -CELLMIN + YY0=X(I)*Y0X+Y(I)*Y0Y+Z(I)*Y0Z -CELLMIN +C find the cell in which the point falls + IX=INT(XX0/DCELL)+1 + IY=INT(YY0/DCELL)+1 +C Set the upper boundary point (useful for xx0==cellmax) + IF(IX.EQ.NCELL+1) IX=NCELL + IF(IY.EQ.NCELL+1) IY=NCELL +C Safety test + IF(IX.LE.0.OR.IX.GT.NCELL.OR.IY.LE.0.OR.IY.GT.NCELL) THEN + LOST=LOST+1 + GOTO 30 + ENDIF +C ............... Expand each projected surf.point on the grid +C to its projected dimension; decreasing light +C of partially eclipsing surface elements if +C belonging to different objects. +C ################### nota ##################################### +C FPX,FPY,TPX,TPY,YMIN,YMAX,YESP possono tutti essere shiftati +C di YY0, invece di partire da 0. Idem per XPX,XPY etc, si +C risparmia tempo +C ############################################################## +C Computing the projected dimensions for the i surf. element: +C F and T are projected onto the visual plane +C ( In the following statement X0z=0. CAN BE is assumed ####) + FPX= FX(I)*X0X + FY(I)*X0Y + FZ(I)*X0Z + FPY= FX(I)*Y0X + FY(I)*Y0Y + FZ(I)*Y0Z + TPX= TX(I)*X0X + TY(I)*X0Y + TZ(I)*X0Z + TPY= TX(I)*Y0X + TY(I)*Y0Y + TZ(I)*Y0Z +C To avoid rounding error in looking for expansion limits + DUM = ABS(FPY) + DUM1= ABS(TPY) + IF(DUM.LT.R4PREC) FPY=0.0 + IF(DUM1.LT.R4PREC) TPY=0.0 + YMAX= DUM+DUM1 + YMIN=-YMAX +C ################ non serve loppando sulle celle e non sy yesp?## +C To avoid yesp value exactly on grid boundaries, which can cause +C the skipping of some cells. If on cell border is mouved a bit +C into the cell. (If expanded over the previous cell it doesn't +C find y intersection with projected surf.elem skipping this y cell) +C IF(MOD(YMIN+YY0,DCELL).LT.(DCELL/1000.)) YMIN=YMIN+(DCELL/1000.) +C YMAX can't be expanded to the cell boundary . In the last cell +C YESP must be <=YMAX or no y intersection will be found. +C +C First and last Y cell covered by the surf. element, in which +C YMAX and YMIN falls; we have a little asimmetry here: +C if Ymin is on left cell boundary this doesn't expand +C Y on the previous cell. But if Ymax is on the rigth cell +C boundary then expand Y over the next cell. + JYMAX=INT((YMAX+YY0)/DCELL)+1 + JYMIN=INT((YMIN+YY0)/DCELL)+1 +C Test if these two cells are on the projection plane boundaries + IF(JYMIN.LE.0) JYMIN=1 + IF(JYMAX.GT.NCELL) THEN + JYMAX=NCELL + YMAX=CELLMAX-CELLMIN-YY0 + ENDIF +C +C ------------------- loop on y expansion grid range +C + DO 80 JY=JYMIN,JYMAX +C An Y value YESP is computed for each cell covered by the surf.el. +C then the intersections between the projected surf.el. boundary +C and the line Y=YESP are found: these are the X expansion limits +C for this JY row of proj. plane. +C Potrebbe essere utile mettere YESP vicino al bordo della +C cella piu' vicino al punto YY0 in cui cade l'elemento di +C superficie, cioe' al bordo superiore sotto YY0 e a quello +C inferiore sopra. In questo modo ci si mette nelle condizioni +C di trovare le intersezioni X piu' distanti possibile fra loro +C e quindi di espandersi sul massimo numero di celle, qui invece +C puo' capitare di avere YESP che supera l'espasione del surf. el. +C e quindi non trova intersezioni anche se in effetti il surf. el. +C entra un poco nella cella. +C + IF(JY.NE.JYMAX) THEN + YESP=YMIN+(JY-JYMIN)*DCELL + ELSE +C If YESP is out of the plane boundary it's set on boundary + YESP=YMAX + ENDIF +C +C Intesecting the line Y=yesp with the boundary of the proj.surf. el. + IXESP=1 + IF(TPY.NE.0.) THEN + H=(YESP-FPY)/TPY + IF(ABS(H).LE.1.) THEN + XESP12(IXESP)=FPX+TPX*H + IXESP=IXESP+1 + ENDIF + H=(YESP+FPY)/TPY + IF(ABS(H).LE.1.) THEN + XESP12(IXESP)=-FPX+TPX*H + IXESP=IXESP+1 + ENDIF + ENDIF + IF(FPY.NE.0.) THEN + H=(YESP-TPY)/FPY + IF(ABS(H).LE.1.) THEN + XESP12(IXESP)=TPX+FPX*H + IXESP=IXESP+1 + ENDIF + H=(YESP+TPY)/FPY + IF(ABS(H).LE.1.) THEN + XESP12(IXESP)=-TPX+FPX*H + IXESP=IXESP+1 + ENDIF + ENDIF +C + IF(IXESP.EQ.1) THEN +C No intersection, this can happen if the surf element is +C all into Dcell, this case is considered at the end of +C the expansion loop. This can also happen at the Y proj.surf.el. +C boundary if YESP (about on cell boundary) falls is just outside +C the cell it should represent. + GOTO 80 + ELSE IF(IXESP.EQ.2) THEN +C Only one intersection, typically at y surf.el. boundary, when both +C are at the edge of the surf.elem. In this case we should have +C two intersection of equal value, but rounding errors can alter. + XMAX=XESP1 + XMIN=XESP1 + XESP2=XESP1 + ELSE IF(IXESP.GT.3) THEN +C Four intersection are too mutch; this can happen if YESP falls +C EXACTELY on the proj.surf.el. diagonal, or when TPY or FPY are +C about 0, in this case rounding errors can give spurious intersections +C with H and YESP about 0. + WRITE(6,1997) IF,I,IXESP-1,(XESP12(J),J=1,IXESP-1) + IF(PRINTFILE) WRITE(NFILE,1997) + 1 IF,I,IXESP-1,(XESP12(J),J=1,IXESP-1) + 1997 FORMAT(' WARINIG! : in light calculation, phase:',I4,' point:' + 1 I6/' Too mutch expansion directions:',I3,1X,4E15.5) + IF(IXESP.EQ.4) THEN + XMAX=MAX(XESP1,XESP2,XESP3) + XMIN=MAX(XESP1,XESP2,XESP3) + ELSE + XMAX=MAX(XESP1,XESP2,XESP3,XESP4) + XMIN=MAX(XESP1,XESP2,XESP3,XESP4) + ENDIF + ELSE +C IXESP=3 : two intersections, wich are the X expansion limits + XMAX=MAX(XESP1,XESP2) + XMIN=MIN(XESP1,XESP2) + ENDIF +C + JXMIN=INT((XMIN+XX0)/DCELL)+1 + JXMAX=INT((XMAX+XX0)/DCELL)+1 + IF(JXMIN.LE.0) JXMIN=1 + IF(JXMAX.GT.NCELL) JXMAX=NCELL +C +C ------------------- loop on X expansion grid range + DO 82 JX=JXMIN,JXMAX +C + J=ICELL(JX,JY) + NCOUNTE=NCOUNTE+1 +C +C If the grid point JX,JY is void then expand the I point over it + IF(J.EQ.0) THEN + ICELL(JX,JY)=I + IGAINED(I)=IGAINED(I)+1 + NCOUNTV=NCOUNTV+1 +C If filled by a different object + ELSE IF(NUMOBJ(J).NE.NUMOBJ(I)) THEN + NCOUNTD=NCOUNTD+1 + DISTI=X(I)*Z0X+Y(I)*Z0Y+Z(I)*Z0Z + DISTJ=X(J)*Z0X+Y(J)*Z0Y+Z(J)*Z0Z +C if this object is the nearer (the nearer has the greatest DIST) + IF(DISTI.GT.DISTJ) THEN + ICELL(JX,JY)=I + IGAINED(I)=IGAINED(I)+1 + ILOST(J)=ILOST(J)+1 + NCOUNTD1=NCOUNTD1+1 + ELSE +C The other is the nearer + IGAINED(I)=IGAINED(I)+1 + ILOST(I)=ILOST(I)+1 + NCOUNTD2=NCOUNTD2+1 + ENDIF + ELSE +C filled by the same object +C the cell remains assigned to the other object + NCOUNTF=NCOUNTF+1 + ENDIF +C + 82 CONTINUE +C ------------------------------- END OF X EXPANSION LOOP 82 + 80 CONTINUE +C ------------------------------- END OF Y EXPANSION LOOP 80 +C +C Test if this point has some cell which is not eclipsed and in which +C there aren't other points of the same object + IF (IGAINED(I).GT.ILOST(I)) GOTO 30 +C K is the surface element of the cell in which this point falls + K=ICELL(IX,IY) + IF(K.LE.0) THEN +C This is the case in which the surf.elem. << dcell has been jumped +C by the loop. This can hapen when no interseciotn is found, being +C the surf.el. << dcell. + ICELL(IX,IY)=I + IGAINED(I)=IGAINED(I)+1 + NCOUNTV=NCOUNTV+1 +C If filled by a different object (could be if surf.el.< ',2G15.7) + NPSTP=NCELL/100 + NPINIT=1 + DO 62 IXX=1,NPSTP + NPFIN=NPINIT+(100-1) + DO 63 IY=1,NCELL + WRITE(NFILE,6000)IY,YCELL(IY), + 1 (NUMOBJ(ABS(ICELL(IX,IY))),IX=NPINIT,NPFIN) + 6000 FORMAT(1X,I3,1X,G12.3,' = ',100I1) + 63 CONTINUE + NPINIT=NPFIN+1 + 62 CONTINUE + IF(NPINIT.LE.NCELL) THEN + DO 64 IY=1,NCELL + WRITE(NFILE,6000)IY,YCELL(IY), + 1 (NUMOBJ(ABS(ICELL(IX,IY))),IX=NPINIT,NCELL) + 64 CONTINUE + ENDIF +C .................. Prints surf. point for each grid point + IF(NPRINTL.LT.3) GOTO 100 +C Format I5 can't contain numbers > 99999 ,in this case it doesn't print + IF(NPNT.GT.99999) GOTO 100 + WRITE(NFILE,6001) IF,FASE(IF),FASE(IF)/6.283185 + 6001 FORMAT(' Number of surf.element in each grid point for fase n.', + 1 I5,' => ',2G15.7) + NPSTP=NCELL/20 + NPINIT=1 + DO 67 IXX=1,NPSTP + NPFIN=NPINIT+(20-1) + WRITE(NFILE,6004) + WRITE(NFILE,6002)(IX,IX=NPINIT,NPFIN) + 6002 FORMAT(' Cell grid numbers: ',20(1X,I4)) + WRITE(NFILE,6003)(XCELL(IX),IX=NPINIT,NPFIN) + 6003 FORMAT(' Cell grid center :',20(F5.2)) + WRITE(NFILE,6004) + 6004 FORMAT(1X,119(1H-)) + DO 68 IY=1,NCELL + WRITE(NFILE,6005) IY,YCELL(IY), + 1 (ICELL(IX,IY),IX=NPINIT,NPFIN) + 6005 FORMAT(1X,I3,1X,G12.3,' = ',20I5) + 68 CONTINUE + NPINIT=NPFIN+1 + 67 CONTINUE + IF(NPINIT.LE.NCELL) THEN + WRITE(NFILE,6004) + WRITE(NFILE,6002)(IX,IX=NPINIT,NCELL) + WRITE(NFILE,6003)(XCELL(IX),IX=NPINIT,NCELL) + WRITE(NFILE,6004) + DO 69 IY=1,NCELL + WRITE(NFILE,6005) IY,YCELL(IY), + 1 (ICELL(IX,IY),IX=NPINIT,NCELL) + 69 CONTINUE + ENDIF + WRITE(NFILE,6004) +C +C ........................... Printing eclipse-suppressed points +C ############################# solo utili per test non devono esistere + IF(NPRINTL.LT.4) GOTO 100 + WRITE(NFILE,6010) + 6010 FORMAT(' Surface points which appear in the grid, but aren''t', + 1 ' considered, being eclipsed:') + K=0 + NDEL=0 + DO 90 IY=1,NCELL + DO 90 IX=1,NCELL + KK=ICELL(IX,IY) + IF(KK.LE.0) GOTO 90 + IF(IGAINED(KK).GT.ILOST(KK)) GOTO 90 + NDEL=NDEL+1 + K=K+1 + NBUF(K)=KK + IF(K.EQ.MAXBUF) THEN + WRITE(NFILE,6015) (NBUF(J),J=1,MAXBUF) + 6015 FORMAT(1X,20I5) + K=0 + ENDIF + 90 CONTINUE + IF(K.GT.0) WRITE(NFILE,6015) (NBUF(J),J=1,K) + WRITE(NFILE,6017) NDEL + 6017 FORMAT(' total:',I5,' surf.points not considered in the grid') +C +C ............................... Printing the link lists +C + IF(NPRINTL.LT.5) GOTO 100 + WRITE(NFILE,6020) + 6020 FORMAT(' Linklists for the surf.points in the grid:') + K=0 + NLIST=0 + DO 95 I=1,NPNT + KK=I + IF(KK.LE.0) GOTO 95 + IF(IGAINED(KK).LE.0) GOTO 95 + IF(IGAINED(KK).LE.ILOST(KK) ) GOTO 95 + IF(NEXT(KK).LE.0) GOTO 95 +C A linklist has been found, loops on its points. + NLIST=NLIST+1 + WRITE(NFILE,6025) NLIST,KK + 6025 FORMAT(' Linklist:',I5,' First surf.element:',I6) + 96 K=K+1 + NBUF(K)=KK + IF(K.EQ.MAXBUF) THEN + WRITE(NFILE,6015) (NBUF(J),J=1,MAXBUF) + K=0 + ENDIF + KK=NEXT(KK) + IF(KK.GT.0) GOTO 96 + IF(K.GT.0) THEN + WRITE(NFILE,6015) (NBUF(J),J=1,K) + K=0 + ENDIF + 95 CONTINUE + IF(NLIST.LE.0) WRITE(NFILE,6030) + 6030 FORMAT(' NONE') +C + ENDIF + 100 CONTINUE +C ---------------------------------------------- END OF PRINTING +C + 10 CONTINUE +C ................................. end of loop on phases +C + IF(LOST.GT.0) THEN + WRITE(6,1100) LOST + IF(PRINTFILE) WRITE(NFILE,1100) LOST + 1100 FORMAT(' ERROR: ',I6,' LIGHT POINTS LOST IN INTEGRATION '/ + 1 ' This is a real program bug, because you should never have'/ + 2 ' caused this error in subroutine LUCE') + ENDIF +C + RETURN + END +C + SUBROUTINE MAXABS(XMAX,N,X) +C -------------------------------------------------------- +C returns xmax, maximum absolute value of x(n) +C -------------------------------------------------------- + DIMENSION X(N) + XMAX=ABS(X(1)) + DO 10 I=2,N + XX=X(I) + IF(XX.LT.0.) XX=-XX + IF(XX.GT.XMAX) XMAX=XX + 10 CONTINUE + RETURN + END +C +C + SUBROUTINE MAXMIN(XMAX,XMIN,N,X) +C ----------------------------------------------------------- +C This routine find the maximum and minimum values for X +C ROUTINE NOT USED! +C ----------------------------------------------------------- + DIMENSION X(N) + XMAX=X(1) + XMIN=X(1) + DO 10 I=2,N + IF(XMAX.LT.X(I)) XMAX=X(I) + IF(XMIN.GT.X(I)) XMIN=X(I) + 10 CONTINUE + RETURN + END +C + SUBROUTINE NOREFL(NPNT,NIF,FBOLREF,FRIFL) +C -------------------------------------------------- +C This routine sets the reflected flux to zero +C REALLY, MAY BE SIMPLIFIED !!! +C ------------------------------------------------ + DIMENSION FRIFL(NPNT),FBOLREF(3),NIF(2,3) +C +C ..................... loop on objects + DO 10 I=1,3 + N1=NIF(1,I) + N2=NIF(2,I) + FBOLREF(I)=0.0 + IF(N1.LE.0.OR.N2.LE.0) GOTO 10 + DO 20 J=N1,N2 + FRIFL(J)=0.0 + 20 CONTINUE + 10 CONTINUE + RETURN + END +C + SUBROUTINE NORM(N,A,B) +C -------------------------- +C Multiplies B(i) by A +C -------------------------- + DIMENSION B(N) + DO 10 I=1,N + 10 B(I)=B(I)*A + RETURN + END +C + SUBROUTINE NORMC(ANORMC,IFLAG) +C --------------------------------------------------------------- +C Normalizes the light curve to have max value= ANORMC +C This is done for bolometric flux CBOLT, +C and each requested color band CT,(requested bands have iflag>0) +C --------------------------------------------------------------- + PARAMETER (MAXFASI=1000, MAXBANDE=5) + COMMON /LIGHT/ NFASIMX,NFASI,NBANDE, + 1 FASE(MAXFASI),O(MAXBANDE,MAXFASI), + 2 C(3,MAXBANDE,MAXFASI),CT(MAXBANDE,MAXFASI), + 3 CBOL(3,MAXFASI),CBOLT(MAXFASI), + 4 CBOLR(3,MAXFASI),CBOLTR(MAXFASI), + 5 AREA(3),FBOLTOT(3),FBOL(3),FBOLREF(3) +C + DIMENSION IFLAG(MAXBANDE) +C +C normalizing bolometric flux, total and for each object +C also reflection sources are normalized + AMAX=AMAX2(NFASI,CBOLT) + IF(AMAX.EQ.0.0) GOTO 100 + DO 10 I=1,NFASI + CBOLT(I)=CBOLT(I)/AMAX*ANORMC + CBOL(1,I)=CBOL(1,I)/AMAX*ANORMC + CBOL(2,I)=CBOL(2,I)/AMAX*ANORMC + CBOL(3,I)=CBOL(3,I)/AMAX*ANORMC + CBOLTR(I)=CBOLTR(I)/AMAX*ANORMC + CBOLR(1,I)=CBOLR(1,I)/AMAX*ANORMC + CBOLR(2,I)=CBOLR(2,I)/AMAX*ANORMC + CBOLR(3,I)=CBOLR(3,I)/AMAX*ANORMC + 10 CONTINUE + 100 CONTINUE +C +C normalizing color band flux, total and for each object + DO 20 I=1,NBANDE + IF(IFLAG(I).LE.0) GOTO 20 + AMAXB=CT(I,1) + DO 30 J=2,NFASI + IF(CT(I,J).GT.AMAXB) AMAXB=CT(I,J) + 30 CONTINUE + IF(AMAXB.EQ.0.0) GOTO 20 + DO 40 J=1,NFASI + CT(I,J)=CT(I,J)/AMAXB*ANORMC + C(1,I,J)=C(1,I,J)/AMAXB*ANORMC + C(2,I,J)=C(2,I,J)/AMAXB*ANORMC + C(3,I,J)=C(3,I,J)/AMAXB*ANORMC + 40 CONTINUE + 20 CONTINUE + RETURN + END +C + SUBROUTINE NORML(NPNT,FINPUT,TL,F) +C ----------------------------------------------------------- +C Normalization routine. Normalizes the total flux to an +C input given value FINPUT. ( Here the flux of each surface +C element had been previously multiplied by the element area) +C ----------------------------------------------------------- + DIMENSION F(NPNT) + TL=0.0 + DO 10 I=1,NPNT + 10 TL=TL+F(I) + DO 20 I=1,NPNT + 20 F(I)=(FINPUT/TL)*F(I) + RETURN + END +C + SUBROUTINE NULL(N,A) +C ----------------------- +C Fills A with 0.0 +C ---------------------- + DIMENSION A(N) + DO 10 I=1,N + 10 A(I)=0.0 + RETURN + END +C + FUNCTION PLANK(AL,TEMPER) +C ------------------------------------------------- +C Value of Plank function, for lambda AL ( Anstrong ) +C and temperature TEMPER ( K ) +C PLANK= erg/cm**2/sec/sterad / lambda unit +C ------------------------------------------------- +C +C This is for lambda in Anstrong : 1 cm = 1.E8 Anstrong, may give overflow +C PLANK=1.1909D35 / +C 1 ( AL**5 * (DEXP (1.4398D+8/(DBLE(AL)*DBLE(TEMPER)) ) -1.D0) ) +C This is for lambda in cm +C PLANK=1.1909D-5 / +C 1 ( AL**5 * (DEXP (1.4398D0/(DBLE(AL)*DBLE(TEMPER)) ) -1.D0) ) +C This is for lambda in A/1000 and A + AL1=AL/1000. + PLANK=1.1909D20 / + 1 ( AL1**5 * (DEXP (1.4398D+8/(DBLE(AL)*DBLE(TEMPER)) ) -1.D0) ) + RETURN + END +C + FUNCTION PLANKL(AL,TEMPER) +C ------------------------------------------------- +C Value of Plank function * delta lambda +C delta lambda =1 A +C ------------------------------------------------- +C +C This is for lambda in Anstrong : 1 cm = 1.E8 Anstrong + AL1=AL/1000. + PLANKL=1.1909D12 / + 1 ( AL1**5 * (DEXP (1.4398D+8/(DBLE(AL)*DBLE(TEMPER)) ) -1.D0) ) +C PLANKL=1.1909D27 / +C 1 ( AL**5 * (DEXP (1.4398D+8/(DBLE(AL)*DBLE(TEMPER)) ) -1.D0) ) + RETURN + END +C + SUBROUTINE PLOTTING(PRINTFILE,NFILE,PRINT6, + 1 AMOUNTP,NFILE6P,NFILEP,NASCIIP) +C ---------------------------------------------------------------- +C Plotting routine : now only writes on unit nasciip, +C plots are done by an'other program. +C ---------------------------------------------------------------- + PARAMETER (MAXFASI=1000, MAXBANDE=5) + COMMON /LIGHT/ NFASIMX,NFASI,NBANDE, + 1 FASE(MAXFASI),O(MAXBANDE,MAXFASI), + 2 C(3,MAXBANDE,MAXFASI),CT(MAXBANDE,MAXFASI), + 3 CBOL(3,MAXFASI),CBOLT(MAXFASI), + 4 CBOLR(3,MAXFASI),CBOLTR(MAXFASI), + 5 AREA(3),FBOLTOT(3),FBOL(3),FBOLREF(3) +C + LOGICAL PRINTFILE,PRINT6 + DIMENSION FASI01(MAXFASI) +C + DO 10 I=1,NFASI + 10 FASI01(I)=FASE(I)/(2.*3.141593) +C + IF(NASCIIP.GT.0.AND.NASCIIP.LE.99) THEN + OPEN(UNIT=NASCIIP,FORM='FORMATTED',STATUS='NEW') + DO 20 I=1,NFASI + WRITE(NASCIIP,1000) I,FASI01(I),CBOLT(I), + 1 (CT(J,I),J=1,NBANDE),(O(J1,I),J1=1,NBANDE) + 1000 FORMAT(1X,I5,1X,F6.4,11(1X,F9.6)) + 20 CONTINUE + CLOSE(UNIT=NASCIIP) + IF(PRINT6) WRITE(6,2000) NASCIIP,NFASI,NBANDE + IF(PRINTFILE) WRITE(NFILE,2000) NASCIIP,NFASI,NBANDE + 2000 FORMAT(/' Light curve written on unit:',I2,' Num.phases:', + 1 I8,' Num. of colors:',I2) + ENDIF +C + RETURN + END +C + SUBROUTINE POINT(PRINT6,PRINTFILE,NFILE,NRF,NTHF,PKRI,NOBJ, + 1 NPUNT,NPUNTC,R,RY,X0,Y0,Z0,ALZO,ROTAZ,R4PREC, + 2 NPNTMX,X,Y,Z,G,GX,GY,GZ,FX,FY,FZ,TX,TY,TZ,AREA,A,NUMCOARSE, + 3 NUMOBJ) +C ---------------------------------------------------------------- +C Draws a bright point surface, in a rectangle +C R=x half-edge +C RY=y half-edge +C NRF= number of fine r mesh in which 2*R is divided. +C NTHF= coarsing factor=number of fine for each coarse +C NRC= number of r coarse +C if PKRI > 0.0 also the back surface of the rectangle is drawn. +C +C After drawing on the plane x-y the cylinder can be rotated: +C ROTAZ= anti-clockwise angle of rotazion on the plane (x-x'angle) +C ALZO= clockwise rotation around the y' axis (z-z" angle) +C +C ---------------------------------------------------------------- + DIMENSION X(NPNTMX),Y(NPNTMX),Z(NPNTMX) + DIMENSION G(NPNTMX),GX(NPNTMX),GY(NPNTMX),GZ(NPNTMX) + DIMENSION FX(NPNTMX),FY(NPNTMX),FZ(NPNTMX) + DIMENSION TX(NPNTMX),TY(NPNTMX),TZ(NPNTMX) + DIMENSION A(NPNTMX) + DIMENSION NUMCOARSE(NPNTMX),NUMOBJ(NPNTMX) + LOGICAL PRINTFILE,PRINT6 +C +C Coarse mesh + NRC=NRF/NTHF + IF(MOD(NRF,NTHF).NE.0) THEN + WRITE(6,1000) NRF,NTHF + 1000 FORMAT(' ERROR! In drawing a rectangle the number of r mesh:', + 1 I5,' is not consistent with the coarsing factor:',I5) + ENDIF +C +C coarse mesh + EDGE=2.0*R + DRC=EDGE/NRC + DRC5=DRC*0.5 +C fine r mesh + DRF=DRC/NTHF + DRF5=DRF*0.5 +C +C NPUNTC will be incremented below. (NPUNTC is the first void coarse) +C IC is instead the actual coarse, or the last filled one. +C NPUNT is the number of surf.el. generated by this routine + IF(PKRI.GT.0.0) THEN + IC=NPUNTC-2 + ELSE + IC=NPUNTC-1 + ENDIF +C +C Y coarse and fine mesh (Y must be a multiple of X: DRCY=DRC) + DRCY=DRC + EDGEY=2.0*RY + NRCY=EDGEY/DRCY + DRCY5=DRCY*0.5 + DRFY=DRCY/NTHF + DRFY5=DRFY*0.5 +C ............... + NPUNT=0 + AREA=0.0 +C +C ................... Coarse X loop ( from center -R to R) + DO 10 IXC=1,NRC + X1C=-R+(IXC-1)*DRC + X2C= X1C+DRC +C +C ................... Coarse Y loop ( from center -R to R) + DO 10 IYC=1,NRCY + Y1C=-RY+(IYC-1)*DRCY + Y2C= Y1C+DRCY +C + IF(PKRI.GT.0.0) THEN + IC=IC+2 + ELSE + IC=IC+1 + ENDIF +C +C ................... Fine X loop ( from X1C to X2C ) + DO 10 IXF=1,NTHF + XF=X1C+(IXF-1)* DRF +DRF5 +C +C ................... Fine Y loop ( from Y1C to Y2C ) + DO 10 IYF=1,NTHF + YF=Y1C+(IYF-1)* DRFY +DRFY5 +C +C Upper surface point + IF(NPUNT.GE.NPNTMX) THEN + LOST=LOST+1 + GOTO 100 + ELSE + NPUNT=NPUNT+1 + ENDIF + X(NPUNT)= XF + Y(NPUNT)= YF + Z(NPUNT)= 0.0 + GX(NPUNT)= 0.0 + GY(NPUNT)= 0.0 + GZ(NPUNT)= 1.0 + FX(NPUNT)= 0. + FY(NPUNT)= DRFY5 + FZ(NPUNT)= 0. + TX(NPUNT)= DRF5 + TY(NPUNT)= 0. + TZ(NPUNT)= 0. + A(NPUNT) = DRF*DRFY + NUMCOARSE(NPUNT)=IC + NUMOBJ(NPUNT)=NOBJ +C area computation + AREA=A(NPUNT)+AREA +C +C Lower surface point + 100 IF(PKRI.LE.0.0) GOTO 10 + IF(NPUNT.GE.NPNTMX) THEN + LOST=LOST+1 + GOTO 10 + ELSE + NPUNT=NPUNT+1 + ENDIF + X(NPUNT)= XF + Y(NPUNT)= YF + Z(NPUNT)= 0.0 + GX(NPUNT)= 0.0 + GY(NPUNT)= 0.0 + GZ(NPUNT)= -1.0 + FX(NPUNT)= 0.0 + FY(NPUNT)= DRFY5 + FZ(NPUNT)= 0.0 + TX(NPUNT)= -DRF5 + TY(NPUNT)= 0.0 + TZ(NPUNT)= 0.0 + A(NPUNT) = DRF*DRFY + NUMCOARSE(NPUNT)=IC+1 + NUMOBJ(NPUNT)=NOBJ +C Total area computation + AREA=A(NPUNT)+AREA +C + 10 CONTINUE +C +C IF the IC+1 coarse has been filled by loop 10 + IF(PKRI.GT.0.0) IC=IC+1 +C + NPUNTC=IC+1 +C +C Constant potential USEFUL FOR POINT ? + DO 59 I=1,NPUNT + 59 G(I)=1. +C + IF(LOST.GT.0) THEN + WRITE(6,2000) NPUNT,LOST + IF(PRINTFILE) WRITE(NFILE,1000) NPUNT,LOST + 2000 FORMAT(' ERROR! In POINT:OBJECT NOT PROPERLY DRAWN! '/ + 1 ' space available for only:',I6,' surface points.', + 2 ' lost points:',I6/ + 3 ' REDUCE THE MESH PARAMETER OR GO INTO THE FORTRAN LIST TO', + 4 ' INCREASE MAXPT') + ENDIF +C +C ................ optional rotation ..... +C + IF(ALZO.EQ.0.0.AND.ROTAZ.EQ.0.0) GOTO 800 +C The disk is rotated by rotaz around the z axis (anti-clockwise) +C then around the new Y axis (clockwise) by alzo + COSP=COS(ROTAZ) + SINP=SIN(ROTAZ) + COSI=COS(ALZO) + SINI=SIN(ALZO) +C +C To prevent precision broblems + IF(ABS(COSP).LT.R4PREC) COSP=0.0 + IF(ABS(SINP).LT.R4PREC) SINP=0.0 + IF(ABS(COSI).LT.R4PREC) COSI=0.0 + IF(ABS(SINI).LT.R4PREC) SINI=0.0 +C + DO 80 I=1,NPUNT + X1= X(I)* (COSP*COSI) + Y(I) * SINP - Z(I) * (COSP*SINI) + Y1=-X(I)* (SINP*COSI) + Y(I) * COSP + Z(I) * (SINP*SINI) + Z1= X(I)* SINI + Z(I) * COSI + X(I)=X1 + Y(I)=Y1 + Z(I)=Z1 + X1= GX(I)* (COSP*COSI) + GY(I) * SINP - GZ(I) * (COSP*SINI) + Y1=-GX(I)* (SINP*COSI) + GY(I) * COSP + GZ(I) * (SINP*SINI) + Z1= GX(I)* SINI + GZ(I) * COSI + GX(I)=X1 + GY(I)=Y1 + GZ(I)=Z1 + X1= TX(I)* (COSP*COSI) + TY(I) * SINP - TZ(I) * (COSP*SINI) + Y1=-TX(I)* (SINP*COSI) + TY(I) * COSP + TZ(I) * (SINP*SINI) + Z1= TX(I)* SINI + TZ(I) * COSI + TX(I)=X1 + TY(I)=Y1 + TZ(I)=Z1 + X1= FX(I)* (COSP*COSI) + FY(I) * SINP - FZ(I) * (COSP*SINI) + Y1=-FX(I)* (SINP*COSI) + FY(I) * COSP + FZ(I) * (SINP*SINI) + Z1= FX(I)* SINI + FZ(I) * COSI + FX(I)=X1 + FY(I)=Y1 + FZ(I)=Z1 +C + 80 CONTINUE +C + 800 CONTINUE +C shifting the point from the origin=(0,0,0) to x0,y0,z0 + IF(X0.NE.0.0) THEN + DO 90 I=1,NPUNT + 90 X(I)=X(I)+X0 + ENDIF + IF(Y0.NE.0.0) THEN + DO 91 I=1,NPUNT + 91 Y(I)=Y(I)+Y0 + ENDIF + IF(Z0.NE.0.0) THEN + DO 92 I=1,NPUNT + 92 Z(I)=Z(I)+Z0 + ENDIF +C + RETURN + END +C + SUBROUTINE PRINTING(AMOUNT,NT6,NT,IPPAR1,IPPAR2, + 1 NAMFLAG,DESCFLAG,NAMPAR,DESCPAR,AUS) +C ---------------------------------- +C Output printing routine +C ---------------------------------- + PARAMETER (MAXPT=200000 ,MAXALLIN=250000) + PARAMETER (MAXPTC=50000) + PARAMETER ( MAXFASI=1000, MAXBANDE=5) + PARAMETER (MAXFLAG=21 , MAXPAR=128 , MAXPARS=20 ) + PARAMETER (MAXCELL=1000 ) + PARAMETER (MAXTITLE=5) + PARAMETER ( MAXFILT=5 , MAXLAM=15 ) +C + COMMON /SURF/ NPNTMX,NPNT,NPNT1,NPNT2,NPNT3, + A N1I,N1F,N2I,N2F,N3I,N3F, + 1 X(MAXPT),Y(MAXPT),Z(MAXPT), + 2 G(MAXPT),GX(MAXPT),GY(MAXPT),GZ(MAXPT), + 3 FX(MAXPT),FY(MAXPT),FZ(MAXPT), + 4 TX(MAXPT),TY(MAXPT),TZ(MAXPT), + 5 T(MAXPT),A(MAXPT), + 6 FB(MAXPT),F(MAXPT,MAXBANDE),FRIFL(MAXPT), + 7 XLIMB(MAXPT),NUMOBJ(MAXPT),ALB(MAXPT), + 8 NUMCOARSE(MAXPT) +C + DIMENSION NP123(3) + DIMENSION NIF(2,3) + EQUIVALENCE (NP123(1),NPNT1),(NIF(1,1),N1I) + COMMON /SURFC/ NPNTMXC,NPNTC,NPNT1C,NPNT2C,NPNT3C, + A N1IC,N1FC,N2IC,N2FC,N3IC,N3FC, + 1 XC(MAXPTC),YC(MAXPTC),ZC(MAXPTC), + 2 GC(MAXPTC),GXC(MAXPTC),GYC(MAXPTC),GZC(MAXPTC), + 5 AC(MAXPTC), + 6 DIMCX(MAXPTC),DIMCY(MAXPTC),DIMCZ(MAXPTC), + 6 FBC(MAXPTC),FRIFLC(MAXPTC), + 7 XLIMBC(MAXPTC),NUMOBJC(MAXPTC),ALBC(MAXPTC), + 8 NUMFINI(MAXPTC) + DIMENSION NP123C(3) + DIMENSION NIFC(2,3) + EQUIVALENCE (NP123C(1),NPNT1C),(NIFC(1,1),N1IC) +C +C + COMMON /ALLIN/ NALLMX,NALL,ITERDONE, + 1 ISOUR(MAXALLIN),JRIC(MAXALLIN), + 2 TRANSFI(MAXALLIN),TRANSFJ(MAXALLIN), + 3 FSOURI(MAXALLIN),FSOURJ(MAXALLIN), + 4 FRICI(MAXALLIN),FRICJ(MAXALLIN), + 5 RIJ(MAXALLIN), + 6 RXIJ(MAXALLIN),RYIJ(MAXALLIN),RZIJ(MAXALLIN), + 7 COSGI(MAXALLIN),COSGJ(MAXALLIN), + 8 IAUS(MAXALLIN) +C + COMMON /LIGHT/ NFASIMX,NFASI,NBANDE, + 1 FASE(MAXFASI),O(MAXBANDE,MAXFASI), + 2 C(3,MAXBANDE,MAXFASI),CT(MAXBANDE,MAXFASI), + 3 CBOL(3,MAXFASI),CBOLT(MAXFASI), + 4 CBOLR(3,MAXFASI),CBOLTR(MAXFASI), + 5 AREA(3),FBOLTOT(3),FBOL(3),FBOLREF(3) +C + COMMON /VISUAL/ NCELL,CELLMAX,CELLMIN,DCELL, + 1 XCELL(MAXCELL),YCELL(MAXCELL) +C + COMMON/TITLE/NTITLEMX,NTITLE,TITLE(MAXTITLE) + CHARACTER*80 TITLE +C + COMMON /ROCHE/ AL1,AL2,AL3,XA1,XA2,XB1,XB2,YA,YB, + 1 OMEGAL1,OMEGAL2,OMEGAL3, + 2 RPOLE(3),XPOLE(3),YPOLE(3),ZPOLE(3),TPOLE(3), + 3 GXPOLE(3),GYPOLE(3),GZPOLE(3) +C + COMMON /FILTRI/ NFILT,NLAM, NLAMBDA(MAXFILT),DELTALAM(MAXLAM), + 1 ALAMBDA(MAXLAM,MAXFILT),TRASMISS(MAXLAM,MAXFILT), + 2 COMPFRAC(MAXFILT,3) +C + COMMON /PAR/ NFLAG,IFLAG(MAXFLAG),NPAR,PAR(MAXPAR) + DIMENSION PARS(MAXPARS,3) + EQUIVALENCE (PARS(1,1),PAR(1)) + DIMENSION IPPAR1(MAXFLAG),IPPAR2(MAXFLAG) + CHARACTER*(*) NAMFLAG(MAXFLAG),DESCFLAG(MAXFLAG) + CHARACTER*(*) NAMPAR(MAXPAR),DESCPAR(MAXPAR) +C + DIMENSION AUS(MAXPT) +C + DIMENSION FASI01(MAXFASI) + CHARACTER*3 YESNO(-1:2) + DATA YESNO/'OLD','NO ','YES','NEW'/ +C primo: flag used to know if some line has been printed + LOGICAL PRIMO +C ............................................................ +C +C ............... phases from 0 to 1 for printing only + DO 10 I=1,NFASI + 10 FASI01(I)=FASE(I)/(3.14159*2.) +C +C ............... computing radii for each surf element if needed + IF(AMOUNT.GE.6..AND.(NT6.GT.0.OR.(NT.GT.0.AND.NT.LE.99) )) THEN + DO 20 I=1,NPNT + NUMERO=NUMOBJ(I) + X000=PARS(3,NUMERO) + Y000=PARS(4,NUMERO) + Z000=PARS(5,NUMERO) + AUS(I)=SQRT( (X(I)-X000)*(X(I)-X000)+ + 1 (Y(I)-Y000)*(Y(I)-Y000)+ + 2 (Z(I)-Z000)*(Z(I)-Z000) ) + 20 CONTINUE + ENDIF +C +C ------------------------------ PRINTING ON UNIT 6 + IF(NT6.GT.0) THEN +C + IF(AMOUNT.LT.1.0) GO TO 600 +C ......................... general and input data + WRITE(6,5800) + 5800 FORMAT(1H1///,50X,29('-')/50X,' Ligth Curve Analysis Results'/ + 1 50X,29('-')// ) + WRITE(6,5799) (TITLE(J),J=1,NTITLE) + 5799 FORMAT(20X,A80) + WRITE(6,5801) + 5801 FORMAT(//' OPTION SUMMARY:') + WRITE(6,5802) (NAMFLAG(J),DESCFLAG(J),YESNO(IFLAG(J)),J=1,10) + 5802 FORMAT(1X,A,A,4X,A) +C .................... Printing orbital parameters + WRITE(6,5813) + 5813 FORMAT(//' ORBITAL AND GRID PARAMETERS:') + K1=IPPAR1(11) + K2=IPPAR2(11) + WRITE(6,5804) (NAMPAR(J),DESCPAR(J),PAR(J),J=K1,K2) + K1=IPPAR1(12) + K2=IPPAR2(12) + WRITE(6,5804) (NAMPAR(J),DESCPAR(J),PAR(J),J=K1,K2) + K1=IPPAR1(13) + K2=IPPAR2(13) + WRITE(6,5804) (NAMPAR(J),DESCPAR(J),PAR(J),J=K1,K2) + 5804 FORMAT(1X,A,A,4X,G15.7) +C ..................... Printing reflection parameters + IF(IFLAG(9).GT.0) THEN + WRITE(6,5805) + 5805 FORMAT(/' PARAMETERS FOR REFLECTION COMPUTATION') + K1=IPPAR1(9) + K2=IPPAR2(9) + WRITE(6,5804) (NAMPAR(J),DESCPAR(J),PAR(J),J=K1,K2) + ENDIF +C .......................... printing colour band parameter + DO 30 I=4,7 + IF(IFLAG(I).LE.0) GOTO 30 + K1=IPPAR1(I) + K2=IPPAR2(I) + WRITE(6,5830) I-3,(NAMPAR(J),DESCPAR(J),PAR(J),J=K1,K2) + 5830 FORMAT(/' INPUT PARAMETERS FOR COLOUR BAND: ',I2/ + 1 ((2X,A,2X,A,2X,G15.7)) ) + 30 CONTINUE +C .......................... printing print input parameters + K1=IPPAR1(20) + K2=IPPAR2(20) + WRITE(6,6015) (NAMPAR(J),DESCPAR(J),PAR(J),J=K1,K2) + 6015 FORMAT(//' PRINTED OUTPUT PARAMETERS:'/((2X,A,2X,A,2X,G15.7))) +C +C .......................... printing plot input parameters + IF(IFLAG(21).GT.0) THEN + K1=IPPAR1(21) + K2=IPPAR2(21) + WRITE(6,6017) (NAMPAR(J),DESCPAR(J),PAR(J),J=K1,K2) + 6017 FORMAT(//' PLOTTING OUTPUT PARAMETERS:'/((2X,A,2X,A,2X,G15.7))) + ENDIF +C +C .................. Printing stars and disk parameters + DO 60 I=1,3 + IF(NP123(I).LE.0) GOTO 60 + K1=(I-1)*MAXPARS+1 + K2=I*MAXPARS + WRITE(6,6000) I,(NAMPAR(J),DESCPAR(J),PAR(J),J=K1,K2) + 6000 FORMAT(/' INPUT PARAMETERS FOR OBJECT NUMBER: ',I2/ + 1 ((2X,A,2X,A,2X,G15.7)) ) + 60 CONTINUE +C .............. roche model parameters + IF(PARS(1,1).EQ.2..OR.PARS(1,2).EQ.2.) THEN + WRITE(6,6005) AL1,AL2,AL3,OMEGAL1,OMEGAL2,OMEGAL3, + 1 XA1,XA2,XB1,XB2,YA,YB + 6005 FORMAT(/' ROCHE MODEL DATA:'/ + 1 ' L1,L2,L3 : lagrange points x position:',3G15.7/ + 2 ' potential for surfaces at L1,L2,L3 :',3G15.7/ + 3 ' XA1,XA2 : intersection star A-x axis:',2G15.7/ + 4 ' XB1,XB2 : intersection star B-x axis:',2G15.7/ + 5 ' approx. y dimension for critical lobe:',2G15.7) + PRIMO=.TRUE. + DO 62 I=1,3 + IF(PARS(1,I).NE.2..OR.PARS(9,I).LE.0.0) GOTO 62 +C Following data is computed only for roche model and gravity dark. + IF(PRIMO) THEN + WRITE(6,6006) + 6006 FORMAT(//' Obj. ,pole: R',7X,'X',7X,7X,'Y',7X,7X,'Z',7X, + 1 7X,'GX',6X,7X,'GY',6X,7X,'GZ',6X,10X,'T') + PRIMO=.FALSE. + ENDIF + WRITE(6,6007) I,RPOLE(I),XPOLE(I),YPOLE(I),ZPOLE(I), + 2 GXPOLE(I),GYPOLE(I),GZPOLE(I),TPOLE(I) + 6007 FORMAT(1X,I2,1X,8G15.7) + 62 CONTINUE + ENDIF +C ........................... run data + K1=INT(PAR(IPPAR1(9)+3)) + WRITE(6,5803) NPNT,NPNTMX,NPNT1,NPNT2,NPNT3, + 1 NPNTC,NPNTMXC,K1,NPNT1C,NPNT2C,NPNT3C, + 2 NALL,MAXALLIN,ITERDONE + 5803 FORMAT(/' RUN PARAMETERS:'// + 1 10X,' Fine grid surface elements :',I10,10X,' Max allowed :', + 2 I10/48X,' For object 1:',I10/48X,' For object 2:',I10/ + 3 48X,' For object 3:',I10// + 4 10X,' Coarse grid surface elements:',I10,10X,' Max allowed :', + 5 I10,' Coarsing factor:',I5/ + 6 48X,' For object 1:',I10/48X,' For object 2:',I10/ + 6 48X,' For object 3:',I10/ + 7 10X,' Reflection paths:',I10,10X,' Max allowed :',I10, + 8 10X,' Iterations done:',I5) +C + WRITE(6,6010) + 6010 FORMAT(///' BOLOMETRIC LUMINOSITY FOR EACH OBJECT :'/ + 1 ' object number, total surf.area,', + 2 ' emitted lumin.,reflected lum.,' + 3 ' total lum., input lum. value, lum.norm.factor') + DO 61 I=1,3 + IF(NP123(I).LE.0) GOTO 61 + FBOLTR=FBOL(I)+FBOLREF(I) + WRITE(6,6011) I,AREA(I),FBOL(I),FBOLREF(I),FBOLTR, + 1 PARS(11,I),FBOLTOT(I) + 6011 FORMAT(I9,7X,6G15.7) + 61 CONTINUE +C + WRITE(6,6012) + WRITE(6,6013) (I,(COMPFRAC(IB,I),IB=1,NFILT),I=1,3) + 6012 FORMAT(//' Objectc ',7X,'U-band lum.',5X,'B-band lum.',5X, + 1 'V-band lum.',5X,'R-band lum.',5X,'I-band lum.') + 6013 FORMAT((1X,I4,5X,5(1X,G15.7))) +C + IF(AMOUNT.LT.2.0) GOTO 600 +C ...................... light received for each phase + WRITE(6,6020) NCELL,NCELL,DCELL,CELLMIN,CELLMAX + 6020 FORMAT(///' LIGHT CURVE PRODUCED:',8X, + 1 '(grid used:',I4,' *',I4,5X,'; step:',G12.5,2X,' from:', + 2 G12.5,5X,' to:',G12.5,' )'/5X,'Phase',5X,13X, + 3 5X,'bol.lum.',6X,'from star A',4X,'from star B',5X,'from disk') + WRITE(6,6021) + 1 (J,FASE(J),FASI01(J),CBOLT(J),CBOL(1,J),CBOL(2,J),CBOL(3,J), + 2 J=1,NFASI) + 6021 FORMAT((I4,G12.5,1X,G12.5,4(1X,G14.7))) +C + IF(AMOUNT.LT.2.5) GOTO 600 +C .......................... reflected light for each fase + IF(IFLAG(9).GT.0) THEN + WRITE(6,6025) + 6025 FORMAT(///' REFLECTED LIGHT:'/5X,'Phase',5X,13X, + 3 4X,'refl.lum.',6X,'from star A',4X,'from star B',5X,'from disk') + WRITE(6,6021) + 1 (J,FASE(J),FASI01(J),CBOLTR(J),CBOLR(1,J),CBOLR(2,J),CBOLR(3,J), + 2 J=1,NFASI) +C +C .......................... light curve without reflection + WRITE(6,6026) + 6026 FORMAT(///' LIGHT CURVE WITHOUT REFLECTION:'/5X,'Phase',5X,13X,2X + 3,'unrefl.lum.',6X,'from star A',4X,'from star B',5X,'from disk') + WRITE(6,6021) + 1 (J,FASE(J),FASI01(J),CBOLT(J)-CBOLTR(J), + 2 CBOL(1,J)-CBOLR(1,J),CBOL(2,J)-CBOLR(2,J), + 3 CBOL(3,J)-CBOLR(3,J),J=1,NFASI) + ENDIF +C + IF(AMOUNT.LT.3.0) GOTO 600 +C ...................... Color band flux + DO 65 IB=1,NBANDE + IF(IFLAG(3+IB).LE.0) GOTO 65 + WRITE(6,6030) IB + 6030 FORMAT(///' LIGHT CURVE FOR COLOR ',I2,' :'/5X,'Phase',5X,13X,2X + 3,'luminosity ',6X,'from star A',4X,'from star B',5X,'from disk', + 4 4X,' observed ') + WRITE(6,6031) + 1 (J,FASE(J),FASI01(J),CT(IB,J),C(1,IB,J),C(2,IB,J),C(3,IB,J), + 2 O(IB,J),J=1,NFASI) + 6031 FORMAT((I4,G12.5,1X,G12.5,5(1X,G14.7) )) + 65 CONTINUE +C + IF(AMOUNT.LT.5.0) GOTO 600 +C ..................... Coarse grid description of surfaces + IF(IFLAG(9).GT.0) THEN + WRITE(6,6045) + 6045 FORMAT(///' COARSE GRID SURFACE ELEMENTS DESCRIBING OBJECTS:' + a /' N. object', + 1 4X,'x',13X,'y',12X,'z',11X,'area', + 2 12X,'g',13X,'gx',11X,'gy',12X,'gz',11X,'num.fines'/) + WRITE(6,6046) + 1 (J,NUMOBJC(J),XC(J),YC(J),ZC(J),AC(J), + 2 GC(J),GXC(J),GYC(J),GZC(J),NUMFINI(J),J=1,NPNTC) + 6046 FORMAT((1X,2I3,8(1X,1PG13.6),1X,I9)) + WRITE(6,6047) + 6047 FORMAT(///3X,'N. object',3X,' tot.bol.flux', + 1 5X,'reflected',8X,'limb. dark.',7X,'albedo', + 2 10X,' X-dim.',10X,' Y-dim.',10X,' Z-dim.') + WRITE(6,6048) + 1 (J,NUMOBJC(J),FBC(J),FRIFLC(J),XLIMBC(J),ALBC(J), + 2 DIMCX(J),DIMCY(J),DIMCZ(J),J=1,NPNTC) + 6048 FORMAT((1X,2I4,7(2X,G15.7))) + ENDIF +C + IF(AMOUNT.LT.6.0) GOTO 600 +C ..................... Fine grid description of surfaces + WRITE(6,6050) + 6050 FORMAT(///' FINE GRID SURFACE ELEMENTS DESCRIBING OBJECTS:' + a /' N. object', + 1 3X,'x',13X,'y',12X,'z',11X,'area',3X,'coarse point' + 2 6X,'g',13X,'gx',13X,'gy',10X,'gz'/) + WRITE(6,6051) + 1 (J,NUMOBJ(J),X(J),Y(J),Z(J),A(J),NUMCOARSE(J), + 2 G(J),GX(J),GY(J),GZ(J),J=1,NPNT) + 6051 FORMAT((1X,I6,I2,4(1X,1PG13.6),1X,I6,4(1X,1PG13.6))) + WRITE(6,6052) + 6052 FORMAT(///3X,'N. object',3X,'temperature',3X,' tot.bol.flux', + 1 8X,'reflected',8X,'limb. dark.',7X,'albedo',10X,'radius') + WRITE(6,6053) + 1(J,NUMOBJ(J),T(J),FB(J),FRIFL(J),XLIMB(J),ALB(J),AUS(J),J=1,NPNT) + 6053 FORMAT((1X,I5,I3,6(2X,1PG15.7))) + WRITE(6,6054) + 6054 FORMAT(///5X,' ESTENSION FOR EACH SURFACE ELEMENT:'// + 1 3X,'N. object',8X,'Fx',13X,'Fy',17X,'Fz', + 2 13X,'Tx',16X,'Ty',15X,'Tz') + WRITE(6,6055) + 1 (J,NUMOBJ(J),FX(J),FY(J),FZ(J),TX(J),TY(J),TZ(J),J=1,NPNT) + 6055 FORMAT((1X,I5,I3,6(2X,1PG15.7))) +C ...................... +C flux for each band : omissis +C + IF(AMOUNT.LT.7) GOTO 600 +C .......................... Alignement for reflection + IF(IFLAG(9).LE.0) GOTO 600 + WRITE(6,6070) ITERDONE,PAR(IPPAR1(9)) + 6070 FORMAT(///' REFLECTION PATHS:'/ + 1 40X,' iterations:',I5,5X,' albedo:',G15.7/ + 2 ' path,sour-rec.coar.point,transf.func.,inv.trans,', + 3 ' d**2',7X,'cosgi',7X,'cosgj',2x,'last iter.source from I,J', + 4 ' last iter. received by I,J') + WRITE(6,6071) (J,ISOUR(J),JRIC(J),TRANSFI(J),TRANSFJ(J),RIJ(J), + 1COSGI(J),COSGJ(J),FSOURI(J),FSOURJ(J),FRICI(J),FRICJ(J),J=1,NALL) + 6071 FORMAT((1X,I5,2I6,4X,9(1X,G11.4))) +C + ENDIF + 600 CONTINUE +C +C ------------------------------ PRINTING ON UNIT NT + IF(NT.GT.0.AND.NT.LE.99) THEN + IF(AMOUNT.LT.1.0) GO TO 700 +C ......................... general and input data + WRITE(NT,5800) + WRITE(NT,5799) (TITLE(J),J=1,NTITLE) + WRITE(NT,5801) + WRITE(NT,5802) (NAMFLAG(J),DESCFLAG(J),YESNO(IFLAG(J)),J=1,10) +C Printing orbital parameters + WRITE(NT,5813) + K1=IPPAR1(11) + K2=IPPAR2(11) + WRITE(NT,5804) (NAMPAR(J),DESCPAR(J),PAR(J),J=K1,K2) + K1=IPPAR1(12) + K2=IPPAR2(12) + WRITE(NT,5804) (NAMPAR(J),DESCPAR(J),PAR(J),J=K1,K2) + K1=IPPAR1(13) + K2=IPPAR2(13) + WRITE(NT,5804) (NAMPAR(J),DESCPAR(J),PAR(J),J=K1,K2) +C ........................Printing reflection parameters + IF(IFLAG(9).GT.0) THEN + WRITE(NT,5805) + K1=IPPAR1(9) + K2=IPPAR2(9) + WRITE(NT,5804) (NAMPAR(J),DESCPAR(J),PAR(J),J=K1,K2) + ENDIF +C .......................... printing colour band parameter + DO 31 I=4,7 + IF(IFLAG(I).LE.0) GOTO 31 + K1=IPPAR1(I) + K2=IPPAR2(I) + WRITE(NT,5830) I-3,(NAMPAR(J),DESCPAR(J),PAR(J),J=K1,K2) + 31 CONTINUE +C .......................... printing plot input parameters + IF(IFLAG(21).GT.0) THEN + K1=IPPAR1(21) + K2=IPPAR2(21) + WRITE(NT,6017) (NAMPAR(J),DESCPAR(J),PAR(J),J=K1,K2) + ENDIF +C .......................... printing print input parameters + K1=IPPAR1(20) + K2=IPPAR2(20) + WRITE(NT,6015) (NAMPAR(J),DESCPAR(J),PAR(J),J=K1,K2) +C +C ........................Printing stars and disk parameters + DO 70 I=1,3 + IF(NP123(I).LE.0) GOTO 70 + K1=(I-1)*MAXPARS+1 + K2=I*MAXPARS + WRITE(NT,6000) I,(NAMPAR(J),DESCPAR(J),PAR(J),J=K1,K2) +C WRITE(NT,6000) I,(PARS(JJ,I),JJ=1,13) + 70 CONTINUE +C ....................... roche model parameters + IF(PARS(1,1).EQ.2..OR.PARS(1,2).EQ.2.) THEN + WRITE(NT,6005) AL1,AL2,AL3,OMEGAL1,OMEGAL2,OMEGAL3, + 1 XA1,XA2,XB1,XB2,YA,YB + PRIMO=.TRUE. + DO 72 I=1,3 + IF(PARS(1,I).NE.2..OR.PARS(9,I).LE.0.0) GOTO 72 +C Following data is computed only for roche model and gravity dark. + IF(PRIMO) THEN + WRITE(NT,6006) + PRIMO=.FALSE. + ENDIF + WRITE(NT,6007) I,RPOLE(I),XPOLE(I),YPOLE(I),ZPOLE(I), + 2 GXPOLE(I),GYPOLE(I),GZPOLE(I),TPOLE(I) + 72 CONTINUE + ENDIF +C ........................... run data + K1=INT(PAR(IPPAR1(9)+3)) + WRITE(NT,5803) NPNT,NPNTMX,NPNT1,NPNT2,NPNT3, + 1 NPNTC,NPNTMXC,K1,NPNT1C,NPNT2C,NPNT3C, + 2 NALL,MAXALLIN,ITERDONE +C + WRITE(NT,6010) + DO 71 I=1,3 + IF(NP123(I).LE.0) GOTO 71 + FBOLTR=FBOL(I)+FBOLREF(I) + WRITE(NT,6011) I,AREA(I),FBOL(I),FBOLREF(I),FBOLTR, + 1 PARS(11,I),FBOLTOT(I) + 71 CONTINUE +C + WRITE(NT,6012) + WRITE(NT,6013) (I,(COMPFRAC(IB,I),IB=1,NFILT),I=1,3) +C + IF(AMOUNT.LT.2.0) GOTO 700 +C ...................... light received for each phase + WRITE(NT,6020) NCELL,NCELL,DCELL,CELLMIN,CELLMAX + WRITE(NT,6021) + 1 (J,FASE(J),FASI01(J),CBOLT(J),CBOL(1,J),CBOL(2,J),CBOL(3,J), + 2 J=1,NFASI) +C + IF(AMOUNT.LT.2.5) GOTO 600 +C .......................... reflected light for each fase + IF(IFLAG(9).GT.0) THEN + WRITE(NT,6025) + WRITE(NT,6021) + 1 (J,FASE(J),FASI01(J),CBOLTR(J),CBOLR(1,J),CBOLR(2,J),CBOLR(3,J), + 2 J=1,NFASI) +C .......................... light curve without reflection + WRITE(NT,6026) + WRITE(NT,6021) + 1 (J,FASE(J),FASI01(J),CBOLT(J)-CBOLTR(J), + 2 CBOL(1,J)-CBOLR(1,J),CBOL(2,J)-CBOLR(2,J), + 3 CBOL(3,J)-CBOLR(3,J),J=1,NFASI) + ENDIF +C + IF(AMOUNT.LT.3.0) GOTO 700 +C ...................... Color band flux + DO 75 IB=1,NBANDE + IF(IFLAG(3+IB).LE.0) GOTO 75 + WRITE(NT,6030) IB + WRITE(NT,6031) + 1 (J,FASE(J),FASI01(J),CT(IB,J),C(1,IB,J),C(2,IB,J),C(3,IB,J), + 2 O(IB,J),J=1,NFASI) + 75 CONTINUE +C + IF(AMOUNT.LT.5.0) GOTO 700 +C ..................... Coarse grid description of surfaces + IF(IFLAG(9).GT.0) THEN + WRITE(NT,6045) + WRITE(NT,6046) + 1 (J,NUMOBJC(J),XC(J),YC(J),ZC(J),AC(J), + 2 GC(J),GXC(J),GYC(J),GZC(J),NUMFINI(J),J=1,NPNTC) + WRITE(NT,6047) + WRITE(NT,6048) + 1 (J,NUMOBJC(J),FBC(J),FRIFLC(J),XLIMBC(J),ALBC(J), + 2 DIMCX(J),DIMCY(J),DIMCZ(J),J=1,NPNTC) + ENDIF +C + IF(AMOUNT.LT.6.0) GOTO 700 +C ..................... Fine grid Description of surfaces + WRITE(NT,6050) + WRITE(NT,6051) + 1 (J,NUMOBJ(J),X(J),Y(J),Z(J),A(J),NUMCOARSE(J), + 2 G(J),GX(J),GY(J),GZ(J),J=1,NPNT) + WRITE(NT,6052) + WRITE(NT,6053) + 1(J,NUMOBJ(J),T(J),FB(J),FRIFL(J),XLIMB(J),ALB(J),AUS(J),J=1,NPNT) + WRITE(NT,6054) + WRITE(NT,6055) + 1 (J,NUMOBJ(J),FX(J),FY(J),FZ(J),TX(J),TY(J),TZ(J),J=1,NPNT) +C ...................... +C flux for each band : omissis +C + IF(AMOUNT.LT.7) GOTO 700 +C .......................... Alignement for reflection + IF(IFLAG(9).LE.0) GOTO 700 + WRITE(NT,6070) ITERDONE,PAR(IPPAR1(9)) + WRITE(NT,6071) (J,ISOUR(J),JRIC(J),TRANSFI(J),TRANSFJ(J),RIJ(J), + 1COSGI(J),COSGJ(J),FSOURI(J),FSOURJ(J),FRICI(J),FRICJ(J),J=1,NALL) +C + ENDIF + 700 CONTINUE + RETURN + END +C + SUBROUTINE REFLECT(NITER,PKCONV,R4PREC,ALBEDO, + 1 NPRINTR,NFILE,FORDER) +C ------------------------------------------------ +C Computes the light reflected by the 3 objects, +C accounting for the geometry of stars and disk. +C Reflection of increasing orders is computed, +C until the order NITER or if the convergence +C criterion specified by PKCONV is met. +C ALBEDO is an input parameter specifing the +C efficiency of the reflection process +C +C R4PREC: sin,cos < R4prec are assumed 0 to shorten computations +C and avoid rounding error in sin,cos whithout using double precision. +C ------------------------------------------------ + PARAMETER (MAXPT=200000 ,MAXALLIN=250000, MAXBANDE=5) + PARAMETER (MAXPTC=50000) +C + COMMON /SURFC/ NPNTMXC,NPNTC,NPNT1C,NPNT2C,NPNT3C, + A N1IC,N1FC,N2IC,N2FC,N3IC,N3FC, + 1 XC(MAXPTC),YC(MAXPTC),ZC(MAXPTC), + 2 GC(MAXPTC),GXC(MAXPTC),GYC(MAXPTC),GZC(MAXPTC), + 5 AC(MAXPTC), + 6 DIMCX(MAXPTC),DIMCY(MAXPTC),DIMCZ(MAXPTC), + 6 FBC(MAXPTC),FRIFLC(MAXPTC), + 7 XLIMBC(MAXPTC),NUMOBJC(MAXPTC),ALBC(MAXPTC), + 8 NUMFINI(MAXPTC) + DIMENSION NP123C(3) + DIMENSION NIFC(2,3) + EQUIVALENCE (NP123C(1),NPNT1C),(NIFC(1,1),N1IC) +C + COMMON /ALLIN/ NALLMX,NALL,ITERDONE, + 1 ISOUR(MAXALLIN),JRIC(MAXALLIN), + 2 TRANSFI(MAXALLIN),TRANSFJ(MAXALLIN), + 3 FSOURI(MAXALLIN),FSOURJ(MAXALLIN), + 4 FRICI(MAXALLIN),FRICJ(MAXALLIN), + 5 RIJ(MAXALLIN), + 6 RXIJ(MAXALLIN),RYIJ(MAXALLIN),RZIJ(MAXALLIN), + 7 COSGI(MAXALLIN),COSGJ(MAXALLIN), + 8 IAUS(MAXALLIN) +C + DIMENSION FORDER(MAXPTC) +C pi4=1/(4*pi) + PARAMETER PI4=0.07957747 +C ........................................................... +C Zero alignements at the beginning + NALL=0 +C Find allignements (possible reflection paths) +C between objects 1 and 2 ( star A and star B) +C An alignement list is built in common /allin/ + CALL FINDALL(1,2,R4PREC) +C First and last alignement betwenn object 1 and 2 (A and B) + NALLAB1=1 + NALLAB2=NALL +C Eliminates allignements between stars A and B +C which are intercepted by the disk (object 3, or C) +C Common /allin/ is updated. + CALL ALLSEL(3,NALLAB1,NALLAB2) + NALLAB2=NALL +C Find allignements between objects 1 and 3 +C ( star A and disk ), the alignement list +C in common /allin/ is updated + CALL FINDALL(1,3,R4PREC) + NALLAC1=NALLAB2+1 + NALLAC2=NALL +C Eliminates allignement between A and C intercepted by B + CALL ALLSEL(2,NALLAC1,NALLAC2) + NALLAC2=NALL +C Find allignements between objects 2 and 3 +C ( star B and disk ), the alignement list +C in common /allin/ is updated + CALL FINDALL(2,3,R4PREC) + NALLBC1=NALLAC2+1 + NALLBC2=NALL +C Eliminates the alignements between B and C intercepted by A + CALL ALLSEL(1,NALLBC1,NALLBC2) + NALLBC2=NALL +C Completing the data in the alignement list. +C computing FSOUR, initial alignement source + CALL CALCALL(ALBEDO) +C Zero reflection source for each surface element + CALL NULL(NPNTC,FRIFLC) +C Initial value for convergency checks + FMAX=0.0 + DO 40 K=1,NALL + FMAX=FMAX+FSOURI(K)+FSOURJ(K) + 40 CONTINUE +C ------------------------- LOOP ON REFLECTION ORDERS + DO 50 IT=1,NITER +C +C Computes the light transmitted along each allignement + DO 60 K=1,NALL + FRICJ(K)=FSOURI(K)*TRANSFI(K) + 60 FRICI(K)=FSOURJ(K)*TRANSFJ(K) +C Zeroes the light falling on on each coarse surf.elem. for this order + DO 55 K=1,NPNTC + 55 FORDER(K)=0.0 +C Computes the light received by each coarse surface element +C At this reflection order (forder) and the total FRIFLC +C Summing on all path from I to J and inverse (J to I) + DO 70 K=1,NALL + FORDER(JRIC(K)) =FORDER(JRIC(K)) +FRICJ(K) + FORDER(ISOUR(K))=FORDER(ISOUR(K))+FRICI(K) + FRIFLC(JRIC(K)) =FRIFLC(JRIC(K)) +FRICJ(K) + 70 FRIFLC(ISOUR(K))=FRIFLC(ISOUR(K))+FRICI(K) +C +C Convergence check + FMAX1=0.0 + DO 90 K=1,NALL + FMAX1=FMAX1+FRICI(K)+FRICJ(K) + 90 CONTINUE +C +C Prints reflection interation data + IF(NPRINTR.GT.0.AND.NFILE.GT.0.AND.NFILE.LE.99) THEN + WRITE(NFILE,8000) IT,NITER,PKCONV,FMAX,FMAX1 + 8000 FORMAT(//' Reflection hystory: iteration: ',I3,' max iter:', + 1 I3,' conv.check:',G12.4,' initial,this iter refl.flux:', + 2 2G12.4/' path,I:sour.,J:rec.,', + 3 'flux from I, transf.func.I=>J,flux to J,' + 4 'flux from J, transf.func.J=>I,flux to I,' + 5 'Sum I:I=>J this iter.,all iter.') + DO 95 K=1,NALL + I=ISOUR(K) + J=JRIC(K) + WRITE(NFILE,8001) K,I,J,FSOURI(K),TRANSFI(K),FRICJ(K), + 1 FSOURJ(K),TRANSFJ(K),FRICJ(K), + 2 FORDER(K),FRIFLC(K) + 8001 FORMAT((1X,I5,2I6,8(1X,1P,G13.6))) + 95 CONTINUE + ENDIF +C Convergency check continues: + IF(FMAX.NE.0.0) THEN + FFMAX=FMAX1/FMAX + ELSE + FFMAX=0.0 + ENDIF +C + IF(FFMAX.GT.1.)THEN + WRITE(6,1000) IT + IF(NFILE.GT.0.AND.NFILE.LE.99) WRITE(NFILE,1000) IT + 1000 FORMAT(' WARNING! Iteration:',I3,' REFLECTION DIVERGING') + ELSE IF(FFMAX.LT.PKCONV) THEN + ITERDONE=IT + GOTO 500 + ENDIF +C Recomputes sources for the next order of reflection + IF(IT.EQ.NITER) GOTO 50 + DO 80 K=1,NALL + FSOURI(K)=FORDER(ISOUR(K)) + 80 FSOURJ(K)=FORDER(JRIC(K)) +C + 50 CONTINUE + ITERDONE=NITER + 500 RETURN + END +C + SUBROUTINE ROCHES(PRINT6,PRINTFILE,NFILE,NTH,NTHF,NCORD,NPUNT, + 1 NPUNTC, XA,XB,XSHIFT,OMEGA,Q,RIS,PRECISION, + 2 NPNTMX,X,Y,Z,G,GX,GY,GZ,FX,FY,FZ,TX,TY,TZ,AREA,A,NUMCOARSE, + 3 SINFI,COSFI,FUNCTION) +C ---------------------------------------------------------------- +C Called for a Roche lobe star, fills the surface element list +C with the surface elements of a roche lobe of given Omega. +C The main star (object A) is build in (0,0,0) the star B in +C (1,0,0) the star is then shifted on the x axis by XSHIFT. +C RIS=0. for the main star A, otherwise 1. +C XA is the maximum X value, XB the minimum one for this star; +C for star A XA is near the L1 point, while for star B XB is near L1 +C FUNCTION is rochesf1 for main star A, rochesf2 for star B, +C passed to RTNEWT, to compute the Radius value for a given angle +C in the roche model. Q is the mass ratio; +C SINFI,COSFI are working spaces. +C +C This routine has been structured in the same way as Sfera2; +C but, due to a lack in equatorial simmetry for the Roche model, +C the north part and the sud part are not treated togheter. +C The arch lenght has been approximated by the sphere value: +C NCORD=1: Theta and phi arch extension for each surface element +C NCORD=2: Theta and phi cord extension of each surface element +C NCORD=3: Theta and phi tangent segment of each surface element +C T, and F tangent vectors are obtained in an approximate way +C from the spherical ones; to shorten calculations +C ---------------------------------------------------------------- + COMMON /ROCHE/ AL1,AL2,AL3,XA1,XA2,XB1,XB2,YA,YB, + 1 OMEGAL1,OMEGAL2,OMEGAL3, + 2 RPOLE(3),XPOLE(3),YPOLE(3),ZPOLE(3),TPOLE(3), + 3 GXPOLE(3),GYPOLE(3),GZPOLE(3) + DIMENSION X(NPNTMX),Y(NPNTMX),Z(NPNTMX) + DIMENSION G(NPNTMX),GX(NPNTMX),GY(NPNTMX),GZ(NPNTMX) + DIMENSION FX(NPNTMX),FY(NPNTMX),FZ(NPNTMX) + DIMENSION TX(NPNTMX),TY(NPNTMX),TZ(NPNTMX) + DIMENSION A(NPNTMX) + DIMENSION NUMCOARSE(NPNTMX) + DIMENSION SINFI(NPNTMX),COSFI(NPNTMX) + LOGICAL PRINTFILE,PRINT6 + EXTERNAL FUNCTION + DATA PI /3.1415926/ +C DATA PI /3.141592653589793/ +C +C Newton-Cotes Error Counter + NERROR=0 +C Delta theta fine, number of phi fines (same as sfera2): + DTH=PI/(NTH-1) + DTH5=0.5*DTH +C at equator: DFI=(2.*PI)/NFIEQ;DFI5=0.5*DFI then decreases as sin theta + NFIEQ=2*(NTH-1) +C Theta coarse arc interval and number of coarse theta points + DTHC=DTH*NTHF + DTHC5=DTHC*0.5 + NTHC=(NTH+(NTHF-1))/NTHF + IF(NTHC*NTHF.NE.NTH+NTHF-1) THEN + WRITE(6,900) NTH,NTHF + IF(PRINTFILE) WRITE(NFILE,900) NTH,NTHF + 900 FORMAT(/,' ERRROR! The number of theta points:',I6, + 1 ' is not consistent with the coarsing factor:',I6) + ENDIF +C RMAX: Approximate max radius for cord calculation(for F and T): +C NOW THE R VALUE FOR EACH THE THETA PHI IS USED INSTEAD OF RMAX! +C RMAX=MAX(ABS(XA-RIS),ABS(XB-RIS)) + IF(NCORD.LE.1) THEN +C RTCORDA=DTH5*RMAX + RTCORDA=DTH5 + ELSE IF(NCORD.EQ.2) THEN +C RTCORDA=RMAX*SIN(DTH5) + RTCORDA=SIN(DTH5) + ELSE +C RTCORDA=RMAX*TAN(DTH5) + RTCORDA=TAN(DTH5) + ENDIF +C + NPUNT=0 + ICT=NPUNTC + LOST=0 + TH=0.0 +C Limits for Newton Cotes R-Search (star radius) + IF(RIS.EQ.0.0) THEN +C Main star A + RLIM1=PRECISION + RLIM2=AL1 + ELSE +C Minor star B (this work if the max radius of B is in L1) + RLIM1=PRECISION + RLIM2=1.-AL1 + ENDIF +C --------------- +C ................................ North polar cap +C --------------- + IF(NPUNT.EQ.NPNTMX) THEN + LOST=LOST+1 + GOTO 500 + ELSE + NPUNT=NPUNT+1 + ENDIF +C the first r value is the intersection of the lobe with x axis + R=XA-RIS + X1=XA + Y1=0. + Z1=0. +C normal to the surf. in x1,y1,z1 + IF(X1.NE.AL1.AND.X1.NE.AL2) THEN + CALL GRADOMEGA(X1,Y1,Z1,GX(NPUNT),GY(NPUNT),GZ(NPUNT),G(NPUNT),Q) + ELSE +C Singular gradient in lagrangian point + X1MOD=X1-10.*PRECISION + CALL GRADOMEGA(X1MOD,Y1,Z1,GX(NPUNT),GY(NPUNT),GZ(NPUNT), + 1 G(NPUNT),Q) + GX(NPUNT)=1. + GY(NPUNT)=0. + GZ(NPUNT)=0. + ENDIF +C cosine of angle between (x,y,z) and normal vector + COSB=1. + A(NPUNT)=(2.*PI)*(1.-COS(DTH5))*R*(R/COSB) + AREA=A(NPUNT) + X(NPUNT)=X1 + Y(NPUNT)=Y1 + Z(NPUNT)=Z1 + FY(NPUNT)=0. + FZ(NPUNT)=RTCORDA*(R/COSB) + FX(NPUNT)=0. + TY(NPUNT)=RTCORDA*(R/COSB) + TZ(NPUNT)=0. + TX(NPUNT)=0. +C the T and F component along G are subtracted, making T and F +C perpendicular to G + CALL ROSUB(FX(NPUNT),FY(NPUNT),FZ(NPUNT),TX(NPUNT),TY(NPUNT), + 1 TZ(NPUNT),GX(NPUNT),GY(NPUNT),GZ(NPUNT),COSB) + NUMCOARSE(NPUNT)=ICT +C ------------------------------ +C ...........................coarse cap: other theta points +C ------------------------------ + COSTH2=COS(DTH5) + NTHF2=NTHF/2+1 + DO 5 IT=2,NTHF2 + TH=DTH*(IT-1) + SINTH=SIN(TH) + COSTH=COS(TH) + COSTH1=COSTH2 + COSTH2=COS(TH+DTH5) +C .... Number of phi fines for this theta coarse + NFI=INT(NFIEQ*SINTH) + IF(NFI.LT.4) NFI=4 + DFI=2.*PI/NFI + DFI5=DFI*0.5 +C .... F tangent Interval extension for this theta value +C really i should use R instead of RMAX and put the following into loop 5 + IF(NCORD.LE.1) THEN +C RFCORDA=DFI5*RMAX + RFCORDA=DFI5 + ELSE IF(NCORD.EQ.2) THEN +C RFCORDA=RMAX*SIN(TH+DTH5)*SIN(DFI5) + RFCORDA=SIN(TH+DTH5)*SIN(DFI5) + ELSE +C RFCORDA=RMAX*SIN(TH+DTH5)*TAN(DFI5)/COS(DTH5) + RFCORDA=SIN(TH+DTH5)*TAN(DFI5)/COS(DTH5) + ENDIF +C + DO 5 IF=1,NFI + IF(NPUNT.EQ.NPNTMX) THEN + LOST=LOST+1 + GOTO 5 + ELSE + NPUNT=NPUNT+1 + ENDIF + FI=DFI * ( IF-1-INT(NTHF/2) ) + COSFII=COS(FI) + SINFII=SIN(FI) + SINCOS=SINTH*COSFII + SINSIN=SINTH*SINFII +C find r for this theta,fi; preceeding R is given as a guess value +C limits for r search are 0 and L1 (to avoid an r in the other object) + R=RTNEWT(FUNCTION,RLIM1,RLIM2,PRECISION,R,Q,OMEGA,COSTH,SINSIN, + 1 NERROR) + X1=R*COSTH+RIS + Y1=R*SINCOS + Z1=R*SINSIN + CALL GRADOMEGA(X1,Y1,Z1,GX(NPUNT),GY(NPUNT),GZ(NPUNT),G(NPUNT),Q) +C for star B remember that cosb is the angle G-star center +C COSB=((X1-RIS)*GX(NPUNT)+Y1*GY(NPUNT)+Z1*GZ(NPUNT))/R + COSB=(COSTH*GX(NPUNT)+SINCOS*GY(NPUNT)+SINSIN*GZ(NPUNT)) + X(NPUNT)=X1 + Y(NPUNT)=Y1 + Z(NPUNT)=Z1 + FY(NPUNT)=-SINFII*RFCORDA*(R/COSB) + FZ(NPUNT)= COSFII*RFCORDA*(R/COSB) + FX(NPUNT)=0. + TY(NPUNT)= (COSTH*RTCORDA)*COSFII*(R/COSB) + TZ(NPUNT)= (COSTH*RTCORDA)*SINFII*(R/COSB) + TX(NPUNT)=-(SINTH*RTCORDA)*(R/COSB) + CALL ROSUB(FX(NPUNT),FY(NPUNT),FZ(NPUNT),TX(NPUNT),TY(NPUNT), + 1 TZ(NPUNT),GX(NPUNT),GY(NPUNT),GZ(NPUNT),COSB) + DFIRR=DFI*R*R + AREATH=DFIRR*(COSTH1-COSTH2) + A(NPUNT)=AREATH/COSB + AREA=AREA+A(NPUNT) + NUMCOARSE(NPUNT)=ICT + 5 CONTINUE +C ------------------ +C .................................... other theta points +C ------------------ +C +C ------------------------------ Loop on theta values +C -------------------- + NTH1=(NTHF/2)+2 + NTH2=NTH-(NTHF/2)-1 + TH1=(NTH1-1)*DTH + COSTH2=COS(TH1-DTH5) +C num.of phi coarse for this theta to increment ICT for first step below + NFIC=1 +C + DO 20 IT=NTH1,NTH2 + TH=(IT-1)*DTH + SINTH=SIN(TH) + COSTH=COS(TH) + COSTH1=COSTH2 + COSTH2=COS(TH+DTH5) +C ................ changing the theta coarse point each nthf fine points. + IF(MOD(IT+NTHF/2-1,NTHF).EQ.0) THEN + ICT=ICT+NFIC +C Number of phi coarse for this nthf interval + THMEDIO=DTH*(IT-1+NTHF/2) + NFIC=INT(2.*PI*SIN(THMEDIO)/DTHC) + IF(NFIC.LT.4) NFIC=4 +C Number of phi fine for this coarse theta range + NFI=NFIC*NTHF + DFI=(2.*PI)/NFI + DFI5=DFI*0.5 +C Cos and sin fi values for this theta range computed once + DO 25 IF=1,NFI + FI=DFI * ( IF-1-INT(NTHF/2) ) + COSFI(IF)=COS(FI) + SINFI(IF)=SIN(FI) + 25 CONTINUE + ENDIF +C ................................ +C The first coarse num.in phi loop for this th. coar.is ICT + ICF=ICT +C +C really i should use R instead of RMAX and put the following into loop 20 + IF(NCORD.LE.1) THEN +C RFCORDA=DFI5*RMAX + RFCORDA=DFI5 + ELSE +C max diameter of sphere between TH+DTH5 and TH-DTH5: it is +C +DTH5 over and -DTH5 below equator + IF(TH.GT.PI/2.) THEN + SINMAX=SIN(TH-DTH5) + ELSE + SINMAX=SIN(TH+DTH5) + ENDIF + IF(NCORD.EQ.2) THEN + RFCORDA=SINMAX*SIN(DFI5) + ELSE + RFCORDA=SINMAX*TAN(DFI5)/COS(DTH5) + ENDIF + ENDIF +C ------------------------------------ Loop on phi values +C -------------------- + DO 20 IF=1,NFI + IF(NPUNT.EQ.NPNTMX) THEN + LOST=LOST+1 + GOTO 20 + ELSE + NPUNT=NPUNT+1 + ENDIF + SINCOS=SINTH*COSFI(IF) + SINSIN=SINTH*SINFI(IF) + R=RTNEWT(FUNCTION,RLIM1,RLIM2,PRECISION,R,Q,OMEGA,COSTH,SINSIN, + 1 NERROR) + X1=R*COSTH+RIS + Y1=R*SINCOS + Z1=R*SINSIN + CALL GRADOMEGA(X1,Y1,Z1,GX(NPUNT),GY(NPUNT),GZ(NPUNT),G(NPUNT),Q) + COSB=(COSTH*GX(NPUNT)+SINCOS*GY(NPUNT)+SINSIN*GZ(NPUNT)) +C COSB=((X1-RIS)*GX(NPUNT)+Y1*GY(NPUNT)+Z1*GZ(NPUNT))/R + X(NPUNT)=X1 + Y(NPUNT)=Y1 + Z(NPUNT)=Z1 + FY(NPUNT)=-SINFI(IF)*RFCORDA*(R/COSB) + FZ(NPUNT)= COSFI(IF)*RFCORDA*(R/COSB) + FX(NPUNT)=0. + TY(NPUNT)= (COSTH*RTCORDA)*COSFI(IF)*(R/COSB) + TZ(NPUNT)= (COSTH*RTCORDA)*SINFI(IF)*(R/COSB) + TX(NPUNT)=-(SINTH*RTCORDA)*(R/COSB) + CALL ROSUB(FX(NPUNT),FY(NPUNT),FZ(NPUNT),TX(NPUNT),TY(NPUNT), + 1 TZ(NPUNT),GX(NPUNT),GY(NPUNT),GZ(NPUNT),COSB) + DFIRR=DFI*R*R + AREATH=DFIRR*(COSTH1-COSTH2) + A(NPUNT)=AREATH/COSB + AREA=AREA+A(NPUNT) + NUMCOARSE(NPUNT)=ICF +C AT each NTHF phi points change the coarse phi point +C Including the remainder of the division IF/NTHF in the last coarse + IF(MOD(IF,NTHF).EQ.0) ICF=ICF+1 +C + 20 CONTINUE +C +C Next ICT to fill: + ICT=ICT+NFIC +C --------------- +C .................................... South pole +C --------------- + IF(NPUNT.EQ.NPNTMX) THEN + LOST=LOST+1 + GOTO 500 + ELSE + NPUNT=NPUNT+1 + ENDIF + R=RIS-XB + X1=XB + Y1=0. + Z1=0. +C normal to the surf. in x1,y1,z1 + IF(X1.NE.AL1.AND.X1.NE.AL3) THEN + CALL GRADOMEGA(X1,Y1,Z1,GX(NPUNT),GY(NPUNT),GZ(NPUNT),G(NPUNT),Q) + ELSE +C Singular gradient in lagrangian point + X1MOD=X1+10.*PRECISION + CALL GRADOMEGA(X1MOD,Y1,Z1,GX(NPUNT),GY(NPUNT),GZ(NPUNT), + 1 G(NPUNT),Q) + GX(NPUNT)=-1. + GY(NPUNT)=0. + GZ(NPUNT)=0. + ENDIF +C cosine of angle between (x,y,z) and normal vector + COSB=1. + A(NPUNT)=(2.*PI)*(1.-COS(DTH5))*R*R/COSB + AREA=AREA+A(NPUNT) + X(NPUNT)=X1 + Y(NPUNT)=Y1 + Z(NPUNT)=Z1 + FY(NPUNT)=0. + FZ(NPUNT)=-RTCORDA*(R/COSB) + FX(NPUNT)=0. + TY(NPUNT)=RTCORDA*(R/COSB) + TZ(NPUNT)=0. + TX(NPUNT)=0. +C the T and F component along G are subtracted, making T and F +C perpendicular to G + CALL ROSUB(FX(NPUNT),FY(NPUNT),FZ(NPUNT),TX(NPUNT),TY(NPUNT), + 1 TZ(NPUNT),GX(NPUNT),GY(NPUNT),GZ(NPUNT),COSB) + NUMCOARSE(NPUNT)=ICT +C ---------------------------------- +C ...........................sud coarse cap: other theta points +C ---------------------------------- + NTH1=NTH2+1 + NTH2=NTH-1 + TH1=(NTH1-1.)*DTH + COSTH2=COS(TH1-DTH5) + DO 45 IT=NTH1,NTH2 + TH=DTH*(IT-1) + SINTH=SIN(TH) + COSTH=COS(TH) + COSTH1=COSTH2 + COSTH2=COS(TH+DTH5) +C .... Number of phi fines for this theta coarse + NFI=INT(NFIEQ*SINTH) + IF(NFI.LT.4) NFI=4 + DFI=2.*PI/NFI + DFI5=DFI*0.5 +C .... F tangent Interval extension for this theta value +C really i should use R instead of RMAX and put the following into loop 45 + IF(NCORD.LE.1) THEN +C RFCORDA=DFI5*R + RFCORDA=DFI5 + ELSE IF(NCORD.EQ.2) THEN +C RFCORDA=R*SIN(TH-DTH5)*SIN(DFI5) + RFCORDA=SIN(TH-DTH5)*SIN(DFI5) + ELSE +C RFCORDA=R*SIN(TH-DTH5)*TAN(DFI5)/COS(DTH5) + RFCORDA=SIN(TH-DTH5)*TAN(DFI5)/COS(DTH5) + ENDIF +C + DO 45 IF=1,NFI + IF(NPUNT.EQ.NPNTMX) THEN + LOST=LOST+1 + GOTO 5 + ELSE + NPUNT=NPUNT+1 + ENDIF + FI=DFI * ( IF-1-INT(NTHF/2) ) + COSFII=COS(FI) + SINFII=SIN(FI) + SINCOS=SINTH*COSFII + SINSIN=SINTH*SINFII +C find r for this theta,fi; preceeding R is given as a guess value +C limits for r search are 0 and L1 (to avoid an r in the other object) + R=RTNEWT(FUNCTION,RLIM1,RLIM2,PRECISION,R,Q,OMEGA,COSTH,SINSIN, + 1 NERROR) + X1=R*COSTH+RIS + Y1=R*SINCOS + Z1=R*SINSIN + CALL GRADOMEGA(X1,Y1,Z1,GX(NPUNT),GY(NPUNT),GZ(NPUNT),G(NPUNT),Q) + COSB=(COSTH*GX(NPUNT)+SINCOS*GY(NPUNT)+SINSIN*GZ(NPUNT)) +C COSB=((X1-RIS)*GX(NPUNT)+Y1*GY(NPUNT)+Z1*GZ(NPUNT))/R + X(NPUNT)=X1 + Y(NPUNT)=Y1 + Z(NPUNT)=Z1 + FY(NPUNT)=-SINFII*RFCORDA*(R/COSB) + FZ(NPUNT)= COSFII*RFCORDA*(R/COSB) + FX(NPUNT)=0. + TY(NPUNT)= (COSTH*RTCORDA)*COSFII*(R/COSB) + TZ(NPUNT)= (COSTH*RTCORDA)*SINFII*(R/COSB) + TX(NPUNT)=-(SINTH*RTCORDA)*(R/COSB) + CALL ROSUB(FX(NPUNT),FY(NPUNT),FZ(NPUNT),TX(NPUNT),TY(NPUNT), + 1 TZ(NPUNT),GX(NPUNT),GY(NPUNT),GZ(NPUNT),COSB) + DFIRR=DFI*R*R + AREATH=DFIRR*(COSTH1-COSTH2) + A(NPUNT)=AREATH/COSB + AREA=AREA+A(NPUNT) + NUMCOARSE(NPUNT)=ICT + 45 CONTINUE +C + NPUNTC=ICT+1 +C +C Shifts star , if requested + IF(XSHIFT.NE.0.0) THEN + DO 50 J=1,NPUNT + 50 X(J)=X(J)+XSHIFT + ENDIF +C + 500 IF(LOST.GT.0) THEN + WRITE(6,1000) NPUNT,LOST + IF(PRINTFILE) WRITE(NFILE,1000) NPUNT,LOST + 1000 FORMAT(' ERROR! OBJECT NOT PROPERLY DRAWN! '/ + 1 ' space available for only:',I6,' surface points.', + 2 ' lost points:',I6/ + 3 ' REDUCE THE NTHETA PARAMETER OR GO INTO THE FORTRAN LIST TO', + 4 ' INCREASE MAXPT') + ENDIF +C + IF(NERROR.GT.0) THEN + WRITE(6,1100) NERROR + IF(PRINTFILE) WRITE(NFILE,1100) NERROR + 1100 FORMAT(/' ERROR : In roche lobe drawing: r not found for', + 1 I5,' surf.elements'/) + ENDIF + RETURN + END +C + SUBROUTINE ROCHESF1(R,F,DF,Q,OMEGA,A,B) +C --------------------------------------------------------------- +C Used by Roches : lobe function and derivative for main object A +C --------------------------------------------------------------- + DUM=1.+R*R-2.*R*A + SQR3=DUM**(-3./2.) + SQR=1./SQRT(DUM) +C F=1./R-OMEGA+Q*SQR+0.5*(1.+Q)*R*R*(1.-B*B)-A*Q*R+0.5*Q*Q/(1.+Q)old def. +C F=1./R-OMEGA+Q*SQR+0.5*(1.+Q)*R*R*(1.-B*B)-A*Q*R + F=1./R -OMEGA+ 0.5*(1.+Q)*(R*R)*(1.-B*B)+ Q*(SQR-A*R) + DF=(1.+Q)*R*(1.-B*B) -1./(R*R) -Q*( (R-A)*SQR3 + A) + RETURN + END +C + SUBROUTINE ROCHESF2(R,F,DF,Q,OMEGA,A,B) +C --------------------------------------------------------------- +C Used by Roches : lobe function and derivative for minor object B +C --------------------------------------------------------------- + DUM=1.+R*R+2.*R*A + SQR3=DUM**(-3./2.) + SQR=1./SQRT(DUM) +C F=SQR-OMEGA+Q/R+R*A+0.5*(1.+Q)* R*R*(A*A+G*G) +0.5/(1.+Q) old omega def. + F=SQR-OMEGA+Q/R+R*A+0.5*(1.+Q)* (R*R)*(1.-B*B) +0.5*(1.-Q) + DF=A+(1.+Q)*R*(1.-B*B)-Q/(R*R)-(R+A)*SQR3 + RETURN + END +C + SUBROUTINE ROSUB(AX,AY,AZ,BX,BY,BZ,GX,GY,GZ,COSB) +C --------------------------------------------------------- +C Used by Roches: makes A and B vectors normal to G, +C by subtracting their G component, then multiplies by 1/cosb +C --------------------------------------------------------- + COSB1=1./COSB + A1=AX*GX+AY*GY+AZ*GZ + AX=(AX-GX*A1)*COSB1 + AY=(AY-GY*A1)*COSB1 + AZ=(AZ-GZ*A1)*COSB1 + A1=BX*GX+BY*GY+BZ*GZ + BX=(BX-GX*A1)*COSB1 + BY=(BY-GY*A1)*COSB1 + BZ=(BZ-GZ*A1)*COSB1 + RETURN + END +C + FUNCTION RTNEWT(FUNCD,X1,X2,XACC,XGUESS,Q,OMEGA,A,B,NERROR) +C ----------------------------------------------------------- +C Newton-Cotes function's zeroes finder; modified from +C "Numerical Recipes" By Press,Teukolwsky,Flannery,Vetterling +C Cambridge University Press 1986 +C ----------------------------------------------------------- + PARAMETER (JMAX=20) +C RTNEWT=.5*(X1+X2) + RTNEWT=XGUESS + DO 11 J=1,JMAX + CALL FUNCD(RTNEWT,F,DF,Q,OMEGA,A,B) + DX=F/DF + RTNEWT=RTNEWT-DX + IF((X1-RTNEWT)*(RTNEWT-X2).LT.0.) THEN + NERROR=NERROR+1 + IF(NERROR.LE.10) THEN + WRITE(6,1000) + 1000 FORMAT(' ERROR ! : Subr. RTNEWT : zero out of bounds!') + IF(NERROR.EQ.10) WRITE(6,1100) + 1100 FORMAT(' 10 ERRORS !!, ERROR WARNING SUPPRESSED !') + ENDIF + ENDIF + IF(ABS(DX).LT.XACC) RETURN + 11 CONTINUE + NERROR=NERROR+1 + IF(NERROR.LE.10) THEN + WRITE(6,2000) + 2000 FORMAT(' WARNING ! : Subr. RTNEWT : not converging!') + IF(NERROR.EQ.10) WRITE(6,1100) + ENDIF + RETURN + END +C + FUNCTION RTSAFE(FUNCD,X1,X2,XACC,Q,DUM,NERROR) +C ---------------------------------------------------- +C Zeroes for a function FUNCD, from "Numerical Recipes", +C By Press, Teukolwsky, Flannery, with minor changes +C ---------------------------------------------------- + PARAMETER (MAXIT=100) + CALL FUNCD(X1,FL,DF,Q,DUM) +C test if root exactly on bound + IF(ABS(FL).LT.XACC) THEN + RTSAFE=X1 + RETURN + ENDIF + CALL FUNCD(X2,FH,DF,Q,DUM) + IF(ABS(FH).LT.XACC) THEN + RTSAFE=X2 + RETURN + ENDIF + IF(FL*FH.GE.0.) THEN + NERROR=NERROR+1 + IF(NERROR.LE.10) THEN + WRITE(6,1000) + 1000 FORMAT(' ERROR IN RTSAFE! :root must be bracketed') + IF(NERROR.EQ.10) WRITE(6,1100) + 1100 FORMAT(' 10 ERRORS !!, ERROR WARNING SUPPRESSED !') + ENDIF +C RTSAFE=0.0 +C RETURN + ENDIF + IF(FL.LT.0.)THEN + XL=X1 + XH=X2 + ELSE + XH=X1 + XL=X2 + SWAP=FL + FL=FH + FH=SWAP + ENDIF + RTSAFE=.5*(X1+X2) + DXOLD=ABS(X2-X1) + DX=DXOLD + CALL FUNCD(RTSAFE,F,DF,Q,DUM) + DO 11 J=1,MAXIT + IF(((RTSAFE-XH)*DF-F)*((RTSAFE-XL)*DF-F).GE.0. + * .OR. ABS(2.*F).GT.ABS(DXOLD*DF) ) THEN + DXOLD=DX + DX=0.5*(XH-XL) + RTSAFE=XL+DX + IF(XL.EQ.RTSAFE)RETURN + ELSE + DXOLD=DX + DX=F/DF + TEMP=RTSAFE + RTSAFE=RTSAFE-DX + IF(TEMP.EQ.RTSAFE)RETURN + ENDIF + IF(ABS(DX).LT.XACC) RETURN + CALL FUNCD(RTSAFE,F,DF,Q,DUM) + IF(F.LT.0.) THEN + XL=RTSAFE + FL=F + ELSE + XH=RTSAFE + FH=F + ENDIF + 11 CONTINUE + NERROR=NERROR+1 + IF(NERROR.LE.10) THEN + WRITE (6,2000) + 2000 FORMAT(' ERROR IN RTSAFE !', + 1 ' : Root not found:exceeding maximum iterations') + IF(NERROR.EQ.10) WRITE(6,1100) + ENDIF + RETURN + END +C + SUBROUTINE SFERA2(PRINT6,PRINTFILE,NFILE, + 1 NTH,NTHF,NCORD,NPUNT,NPUNTC,R,X0,Y0,Z0, + 2 NPNTMX,X,Y,Z,G,GX,GY,GZ,FX,FY,FZ,TX,TY,TZ,AREA,A,NUMCOARSE, + 3 SINFI,COSFI) +C ---------------------------------------------------------------- +C Called for a spherical star, fills the surface element list +C with the surface elements of a sphere of radiur R and center +C in X0,Y0,Z0. NTH is the number of theta points used to represent +C the sphere; NFI, the number of phi points, is 2(NTH-1), at equator, +C approx.: (NTH-1)*SIN(THETA) otherwise, to have equi-area surfaces. +C Points over and below equator are treated toghether to take +C advantage of simmetry and shorten computation. +C +C COARSE MAP USED FOR REFLECTION COMPUTATION: +C A coarse map NUMCOARSE is built, containing, for each fine surf.el. +C the number of its coarse surf. element. +C To build the coarse map the fine theta points are divided +C into groups of NTHF points: +C Each group of NTHF theta values defines a region on the sphere: +C wide NTHF in theta and 0-2*PI in phi. This region is divided into +C a number of "PHI" coarse intervals, in such a way to have approx, +C the same area for coarse surf. elem. of different theta values. +C The phi values of each theta in this region are divided into +C this number of coarse intervals. +C For each theta, in the group of theta values, the coarse phi +C interval are divided into NTHF fine "PHI" interval, in this way the +C fine grid surf. element are only approx. equiarea, and each +C coarse surf. elem. consists of NTHF*NTHF fine elem. +C +C ICT is the number of the coarse el. for each fine, it is +C odd over and even below equator. +C +C NFIC is the number of phi coarse for a range of theta +C +C NFIF is the number of phi fine points for each coarse, it +C depends on theta coarse; diffenert theta coarse have a diffenent +C number of phi. +C +C ---------------------------------------------------------------- + DIMENSION X(NPNTMX),Y(NPNTMX),Z(NPNTMX) + DIMENSION G(NPNTMX),GX(NPNTMX),GY(NPNTMX),GZ(NPNTMX) + DIMENSION FX(NPNTMX),FY(NPNTMX),FZ(NPNTMX) + DIMENSION TX(NPNTMX),TY(NPNTMX),TZ(NPNTMX) + DIMENSION A(NPNTMX) + DIMENSION NUMCOARSE(NPNTMX) + DIMENSION SINFI(NPNTMX),COSFI(NPNTMX) + LOGICAL PRINTFILE,PRINT6 + DATA PI /3.1415926/ +C DATA PI /3.141592653589793/ +C REAL*8 PI,DFI,DTH,FI,TH +C +C Delta theta fine: theta has bot end included (fi doesn't) + DTH=PI/(NTH-1) + DTH5=0.5*DTH +C Delta phi for equator ( nfi is chosen to have dfi=dth ) +C DFI=(2.*PI)/NFIEQ , DFI5=0.5*DFI + NFIEQ=2*(NTH-1) +C +C ............... Polar and equatorial interval extension +C NCORD=1: Theta and phi arch extension for each surface element +C NCORD=2: Theta and phi cord extension of each surface element +C NCORD=3: Theta and phi tangent segment of each surface element + IF(NCORD.LE.1) THEN + RTCORDA=DTH5*R + ELSE IF(NCORD.EQ.2) THEN + RTCORDA=R*SIN(DTH5) + ELSE + RTCORDA=R*TAN(DTH5) + ENDIF +C +C Theta coarse arc interval + DTHC=DTH*NTHF + DTHC5=DTHC*0.5 +C Number of coarse theta points + NTHC=(NTH+(NTHF-1))/NTHF + IF(NTHC*NTHF.NE.NTH+NTHF-1) THEN + WRITE(6,900) NTH,NTHF + IF(PRINTFILE) WRITE(NFILE,900) NTH,NTHF + 900 FORMAT(/,' ERRROR! The number of theta points:',I6, + 1 ' is not consistent with the coarsing factor:',I6) + ENDIF +C In previous versions NFIF was recomputed at each FI +C ( Each theta had a different number of phi (fine equiarea) + NFIF=NTHF +C + NPUNT=0 + LOST=0 + TH=0.0 +C first coarse point number + ICT=NPUNTC +C --------------- +C ................................ North polar cap +C --------------- + IF(NPUNT.EQ.NPNTMX) THEN + LOST=LOST+1 + GOTO 500 + ELSE + NPUNT=NPUNT+1 + ENDIF + X(NPUNT)=0.0 + Y(NPUNT)=0.0 + Z(NPUNT)=R + GX(NPUNT)=0.0 + GY(NPUNT)=0.0 + GZ(NPUNT)=1.0 + FX(NPUNT)=0. + FY(NPUNT)=RTCORDA + FZ(NPUNT)=0. + TX(NPUNT)=RTCORDA + TY(NPUNT)=0. + TZ(NPUNT)=0. + A(NPUNT)=(2.*PI)*(1.- COS(DTH5))*R*R + NUMCOARSE(NPUNT)=ICT +C Total area computation + AREA=A(NPUNT) +C --------------- +C .................................... South polar cap +C --------------- + IF(NPUNT.EQ.NPNTMX) THEN + LOST=LOST+1 + GOTO 500 + ELSE + NPUNT=NPUNT+1 + ENDIF + X(NPUNT)=0.0 + Y(NPUNT)=0.0 + Z(NPUNT)=-R + GX(NPUNT)=0.0 + GY(NPUNT)=0.0 + GZ(NPUNT)=-1.0 + FX(NPUNT)=0. + FY(NPUNT)=-RTCORDA + FZ(NPUNT)=0. + TX(NPUNT)=RTCORDA + TY(NPUNT)=0. + TZ(NPUNT)=0. + A(NPUNT)=A(NPUNT-1) + AREA=AREA+A(NPUNT) + NUMCOARSE(NPUNT)=ICT+1 +C +C ------------------------------ +C ...........................coarse cap: other theta points +C ------------------------------ + COSTH2=COS(DTH5) + NTHF2=NTHF/2+1 + DO 5 IT=2,NTHF2 + TH=DTH*(IT-1) + SINTH=SIN(TH) + COSTH=COS(TH) + COSTH1=COSTH2 + COSTH2=COS(TH+DTH5) +C .... Number of phi fines +C NFI=NINT(NFIEQ*SINTH) + NFI=INT(NFIEQ*SINTH) + IF(NFI.LT.4) NFI=4 + DFI=2.*PI/NFI + DFI5=DFI*0.5 + DFIRR=DFI*R*R + AREATH=DFIRR*(COSTH1-COSTH2) +C .... Interval extension for this theta value + IF(NCORD.LE.1) THEN + RFCORDA=DFI5*R +C RTCORDA=DTH5*R ! not changing + ELSE IF(NCORD.EQ.2) THEN + RFCORDA=R*SIN(TH+DTH5)*SIN(DFI5) +C RTCORDA=R*SIN(DTH5) ! not changing + ELSE + RFCORDA=R*SIN(TH+DTH5)*TAN(DFI5)/COS(DTH5) +C RTCORDA=R*TAN(DTH5) ! not changing + ENDIF +C + DO 5 IF=1,NFI +C FI=(IF-1)*DFI +C For testing purpose i shift phi: ========================== +C To make phi points consistent with a run: fine=coarse=this nthc + FI=DFI * ( IF-1-INT(NFIF/2) ) + COSFII=COS(FI) + SINFII=SIN(FI) +C + IF(NPUNT.EQ.NPNTMX) THEN + LOST=LOST+1 + GOTO 5 + ELSE + NPUNT=NPUNT+1 + ENDIF + GX(NPUNT)=SINTH*COSFII + GY(NPUNT)=SINTH*SINFII + GZ(NPUNT)=COSTH + X(NPUNT)=R*GX(NPUNT) + Y(NPUNT)=R*GY(NPUNT) + Z(NPUNT)=R*GZ(NPUNT) + FX(NPUNT)=-SINFII*RFCORDA + FY(NPUNT)= COSFII*RFCORDA + FZ(NPUNT)=0. + TX(NPUNT)= (COSTH*RTCORDA)*COSFII + TY(NPUNT)= (COSTH*RTCORDA)*SINFII + TZ(NPUNT)=-(SINTH*RTCORDA) + A(NPUNT)=AREATH + AREA=AREA+AREATH + NUMCOARSE(NPUNT)=ICT +C ........ Simmetric point with theta=pi-theta +C ( cos(theta) -> - cos(theta) , z -> -z) + IF(NPUNT.EQ.NPNTMX) THEN + LOST=LOST+1 + GOTO 5 + ELSE + NPUNT=NPUNT+1 + ENDIF + X(NPUNT)= X(NPUNT-1) + Y(NPUNT)= Y(NPUNT-1) + Z(NPUNT)=-Z(NPUNT-1) + GX(NPUNT)= GX(NPUNT-1) + GY(NPUNT)= GY(NPUNT-1) + GZ(NPUNT)=-GZ(NPUNT-1) + FX(NPUNT)=-SINFII*RFCORDA + FY(NPUNT)= COSFII*RFCORDA + FZ(NPUNT)=0. + TX(NPUNT)=-(COSTH*RTCORDA)*COSFII + TY(NPUNT)=-(COSTH*RTCORDA)*SINFII + TZ(NPUNT)=-SINTH*RTCORDA + A(NPUNT)=AREATH + AREA=AREA+AREATH + NUMCOARSE(NPUNT)=ICT+1 + 5 CONTINUE +C +C ------------------ +C .................................... other theta points +C ------------------ +C +C ------------------------------ Loop on theta values +C -------------------- + NTH1=NTHF/2+2 + NTH2=NTH/2-NTHF/2 + TH1=(NTH1-1)*DTH + NFIC=1 + COSTH2=COS(TH1-DTH5) +C + DO 20 IT=NTH1,NTH2 + TH=(IT-1)*DTH + SINTH=SIN(TH) + COSTH=COS(TH) + COSTH1=COSTH2 + COSTH2=COS(TH+DTH5) +C +C ................................ +C ................ CHANGING THE THETA COARSE POINT EACH NTHF FINE POINTS. +C The first time change when it=nth1, then at each nthf values +C When NTHF=1 defines all data at each pass. (each IT value) +C + IF(MOD(IT+NTHF/2-1,NTHF).EQ.0) THEN +C +C First coarse for next theta group of nthf theta fine points +C ( by using the preceeding value for ICT) + ICT=ICT+NFIC*2 +C +C Number of phi coarse for this nthf interval +C THLAST=DTH*(IT-1+NTHF) +C NFIC=NINT(2.*PI*SIN(THLAST)/DTHC) + THMEDIO=DTH*(IT-1+NTHF/2) +C NFIC=NINT(2.*PI*SIN(THMEDIO)/DTHC) + NFIC=INT(2.*PI*SIN(THMEDIO)/DTHC) + IF(NFIC.LT.4) NFIC=4 +C +C Number of phi fine for this coarse theta range + NFI=NFIC*NTHF + DFI=(2.*PI)/NFI + DFI5=DFI*0.5 + DFIRR=DFI*R*R + IF(NCORD.LE.1) THEN + RDFI5=R*DFI5 + ELSE IF(NCORD.EQ.2) THEN + RSINDFI5=R*SIN(DFI5) + ELSE + RTANDFI5=R*TAN(DFI5) + ENDIF +C Cos and sin fi values for this theta range + DO 25 IF=1,NFI +C FI=DFI*(IF-1) +C For testing purpose: ========================== +C To make phi points consistent with a run: fine=coarse=this nthc + FI=DFI * ( IF-1-INT(NFIF/2) ) + COSFI(IF)=COS(FI) + SINFI(IF)=SIN(FI) + 25 CONTINUE + ENDIF +C ................................ +C +C Set first coarse for the phi loop + ICF=ICT +C Area for the following surface elements + AREATH=DFIRR*(COSTH1-COSTH2) +C ............... interval extension for this theta value + IF(NCORD.LE.1) THEN + RFCORDA=RDFI5 + ELSE IF(NCORD.EQ.2) THEN + RFCORDA=SIN(TH+DTH5)*RSINDFI5 +C RFCORDA=RSINDFI5 + ELSE + RFCORDA=SIN(TH+DTH5)*RTANDFI5/COS(DTH5) +C RFCORDA=RTANDFI5 + ENDIF +C +C ------------------------------------ Loop on phi values +C -------------------- +C + DO 20 IF=1,NFI +C + IF(NPUNT.EQ.NPNTMX) THEN + LOST=LOST+1 + GOTO 20 + ELSE + NPUNT=NPUNT+1 + ENDIF + GX(NPUNT)=SINTH*COSFI(IF) + GY(NPUNT)=SINTH*SINFI(IF) + GZ(NPUNT)=COSTH + X(NPUNT)=R*GX(NPUNT) + Y(NPUNT)=R*GY(NPUNT) + Z(NPUNT)=R*GZ(NPUNT) + FX(NPUNT)=-SINFI(IF)*RFCORDA + FY(NPUNT)= COSFI(IF)*RFCORDA + FZ(NPUNT)=0. + TX(NPUNT)= (COSTH*RTCORDA)*COSFI(IF) + TY(NPUNT)= (COSTH*RTCORDA)*SINFI(IF) + TZ(NPUNT)=-(SINTH*RTCORDA) + A(NPUNT)=AREATH + AREA=AREA+AREATH + NUMCOARSE(NPUNT)=ICF +C ........ Simmetric point with theta=pi-theta +C ( cos(theta) -> - cos(theta) , z -> -z) + IF(NPUNT.EQ.NPNTMX) THEN + LOST=LOST+1 + GOTO 20 + ELSE + NPUNT=NPUNT+1 + ENDIF + X(NPUNT)= X(NPUNT-1) + Y(NPUNT)= Y(NPUNT-1) + Z(NPUNT)=-Z(NPUNT-1) + GX(NPUNT)= GX(NPUNT-1) + GY(NPUNT)= GY(NPUNT-1) + GZ(NPUNT)=-GZ(NPUNT-1) + FX(NPUNT)=-SINFI(IF)*RFCORDA + FY(NPUNT)= COSFI(IF)*RFCORDA + FZ(NPUNT)=0. + TX(NPUNT)=-(COSTH*RTCORDA)*COSFI(IF) + TY(NPUNT)=-(COSTH*RTCORDA)*SINFI(IF) + TZ(NPUNT)=-SINTH*RTCORDA + A(NPUNT)=AREATH + AREA=AREA+AREATH + NUMCOARSE(NPUNT)=ICF+1 +C +C AT each NFIF phi points change the coarse phi point +C Including the remainder of the division IF/NFIF in the last coarse + IF(MOD(IF,NFIF).EQ.0) ICF=ICF+2 +C + 20 CONTINUE +C +C ---------------- +C ................................. Coarse equator +C ---------------- + ICT=ICT+NFIC*2 + NTH1=NTH/2-NTHF/2+1 + NTH2=NTH/2 + TH1=DTH*(NTH1-1) + COSTH2=COS(TH1-DTH5) +C Number of phi coarse for equator fine and coarse=NFIEQ + NFIC=NINT(2.*PI/DTHC) +C NFIC=INT(2.*PI/DTHC) + IF(NFIC.LT.4) NFIC=4 + NFI=NFIC*NFIF + IF(NFI.NE.NFIEQ) THEN + WRITE(6,2000) NFI,NFIEQ + IF(PRINTFILE) WRITE(NFILE,2000) NFI,NFIEQ + 2000 FORMAT(' ERROR IN SFERA2! NFI,NFIEQ INCONSISTENT!:',I5,1X,I5) + ENDIF + DFI=(2.*PI)/NFI + DFI5=DFI*0.5 + DFIRR=DFI*R*R + DO 27 IF=1,NFI +C FI=DFI*(IF-1) +C For testing purpose: ========================= +C To make phi points consistent with a run: fine=coarse=this nthc + FI=DFI * ( IF-1-INT(NFIF/2) ) + COSFI(IF)=COS(FI) + SINFI(IF)=SIN(FI) + 27 CONTINUE +C + DO 29 IT=NTH1,NTH2 + TH=(IT-1)*DTH + SINTH=SIN(TH) + COSTH=COS(TH) + COSTH1=COSTH2 + COSTH2=COS(TH+DTH5) +C ... Interval extension for this theta value #### QUALCOSA ESTRAIBILE + IF(NCORD.LE.1) THEN ! DAL LOOP + RFCORDA=DFI5*R + ELSE IF(NCORD.EQ.2) THEN + RFCORDA=R*SIN(TH+DTH5)*SIN(DFI5) +C RFCORDA=R*SIN(DFI5) + ELSE + RFCORDA=R*SIN(TH+DTH5)*TAN(DFI5)/COS(DTH5) +C RFCORDA=R*TAN(DFI5) + ENDIF +C + ICF=ICT + AREATH=DFIRR*(COSTH1-COSTH2) +C ........................ Fi loop + DO 29 IF=1,NFI + IF(NPUNT.EQ.NPNTMX) THEN + LOST=LOST+1 + GOTO 29 + ELSE + NPUNT=NPUNT+1 + ENDIF + GX(NPUNT)=SINTH*COSFI(IF) + GY(NPUNT)=SINTH*SINFI(IF) + GZ(NPUNT)=COSTH + X(NPUNT)=R*GX(NPUNT) + Y(NPUNT)=R*GY(NPUNT) + Z(NPUNT)=R*GZ(NPUNT) + FX(NPUNT)=-SINFI(IF)*RFCORDA + FY(NPUNT)= COSFI(IF)*RFCORDA + FZ(NPUNT)=0. + TX(NPUNT)= (COSTH*RTCORDA)*COSFI(IF) + TY(NPUNT)= (COSTH*RTCORDA)*SINFI(IF) + TZ(NPUNT)=-(SINTH*RTCORDA) + A(NPUNT)=AREATH + AREA=AREA+AREATH + NUMCOARSE(NPUNT)=ICF +C ........ Simmetric point with theta=pi-theta +C ( cos(theta) -> - cos(theta) , z -> -z) + IF(NPUNT.EQ.NPNTMX) THEN + LOST=LOST+1 + GOTO 29 + ELSE + NPUNT=NPUNT+1 + ENDIF + X(NPUNT)= X(NPUNT-1) + Y(NPUNT)= Y(NPUNT-1) + Z(NPUNT)=-Z(NPUNT-1) + GX(NPUNT)= GX(NPUNT-1) + GY(NPUNT)= GY(NPUNT-1) + GZ(NPUNT)=-GZ(NPUNT-1) + FX(NPUNT)=-SINFI(IF)*RFCORDA + FY(NPUNT)= COSFI(IF)*RFCORDA + FZ(NPUNT)=0. + TX(NPUNT)=-(COSTH*RTCORDA)*COSFI(IF) + TY(NPUNT)=-(COSTH*RTCORDA)*SINFI(IF) + TZ(NPUNT)=-SINTH*RTCORDA + A(NPUNT)=AREATH + AREA=AREA+AREATH + NUMCOARSE(NPUNT)=ICF +C ..... At each NFIF phi points change the coarse phi point + IF(MOD(IF,NFIF).EQ.0) ICF=ICF+1 + 29 CONTINUE +C ------------ +C ......................................... Equator +C ------------ + SINTH=1.0 + COSTH=0.0 + COSTH1=COS(0.5*PI-DTH5) + COSTH2=COS(0.5*PI+DTH5) +C Cord lenght from last theta value + ICF=ICT +C + DO 30 IF=1,NFI +C + IF(NPUNT.EQ.NPNTMX) THEN + LOST=LOST+1 + GOTO 30 + ELSE + NPUNT=NPUNT+1 + ENDIF + GX(NPUNT)=SINTH*COSFI(IF) + GY(NPUNT)=SINTH*SINFI(IF) + GZ(NPUNT)=COSTH + X(NPUNT)=R*GX(NPUNT) + Y(NPUNT)=R*GY(NPUNT) + Z(NPUNT)=R*GZ(NPUNT) + FX(NPUNT)=-SINFI(IF)*RFCORDA + FY(NPUNT)= COSFI(IF)*RFCORDA + FZ(NPUNT)=0. + TX(NPUNT)=COSTH*COSFI(IF)*RTCORDA + TY(NPUNT)=COSTH*SINFI(IF)*RTCORDA + TZ(NPUNT)=-SINTH*RTCORDA + A(NPUNT)=DFI*(COSTH1-COSTH2)*(R*R) + AREA=AREA+A(NPUNT) + NUMCOARSE(NPUNT)=ICF +C Change the coarse point at each nfif fine points + IF(MOD(IF,NFIF).EQ.0)ICF=ICF+1 + 30 CONTINUE + NPUNTC=ICT+NFIC +C +C all complications ended ! WHOW ! +C +C Shifts star , if requested + IF(X0.NE.0.0) THEN + DO 50 J=1,NPUNT + 50 X(J)=X(J)+X0 + ENDIF + IF(Y0.NE.0.0) THEN + DO 53 J=1,NPUNT + 53 Y(J)=Y(J)+Y0 + ENDIF + IF(Z0.NE.0.0) THEN + DO 56 J=1,NPUNT + 56 Z(J)=Z(J)+Z0 + ENDIF +C Constant potential + DO 59 I=1,NPUNT + 59 G(I)=1./R +C + 500 IF(LOST.GT.0) THEN + WRITE(6,1000) NPUNT,LOST + IF(PRINTFILE) WRITE(NFILE,1000) NPUNT,LOST + 1000 FORMAT(' ERROR! OBJECT NOT PROPERLY DRAWN! '/ + 1 ' space available for only:',I6,' surface points.', + 2 ' lost points:',I6/ + 3 ' REDUCE THE NTHETA PARAMETER OR GO INTO THE FORTRAN LIST TO', + 4 ' INCREASE MAXPT') + ENDIF +C + RETURN + END +C + SUBROUTINE SUMREFL(NPNT,NIF,FBOLREF,FRIFL) +C -------------------------------------------------- +C This routine sums the reflected surface element flux +C obtaining the total light reflected by each object +C ------------------------------------------------ + DIMENSION FRIFL(NPNT),FBOLREF(3),NIF(2,3) +C +C ..................... loop on objects + DO 10 I=1,3 + N1=NIF(1,I) + N2=NIF(2,I) + FBOLREF(I)=0.0 + IF(N1.LE.0.OR.N2.LE.0) GOTO 10 + DO 20 J=N1,N2 + FBOLREF(I)=FBOLREF(I)+FRIFL(J) + 20 CONTINUE + 10 CONTINUE + RETURN + END +C + SUBROUTINE TCHANGE(NPNT,FB,FRIFL,T,A) +C ---------------------------------------------------- +C Given FB: bolometric flux * area A, computes T, +C assuming black body spectrum flux=Area*T**4 *ac/4pi +C ---------------------------------------------------- + DIMENSION FB(NPNT),T(NPNT),A(NPNT),FRIFL(NPNT) + PARAMETER (AC4PI=1.8065E-5) + DO 10 I=1,NPNT + 10 T(I)=( (FB(I)+FRIFL(I)) / (AC4PI*A(I)) )**0.25 + RETURN + END +C + SUBROUTINE TOTALE(N,T,A) +C ------------------------------------- +C T=sum of A(i) +C ------------------------------------- + DIMENSION A(N) + T=0 + DO 10 I=1,N + 10 T=T+A(I) + RETURN + END +C + SUBROUTINE UPPERC(C,PROMPT,KF) +C ----------------------------------------------------------- +C Reads an input command and transforms it to upcase letters +C adding 32 to the ascii character decimal value +C (32 is the offset between upcase and lowercase letters) +C This routines doesn't follows the ANSI FORTRAN standards +C If "?" is encountered the scanning stops and KF=1 is returned +C IF "$" in first position,the command is a DCL command, +C and the routine "spawn" creating a subprocess. +C If "!" in first position the line is skipped being a comment +C If "!!" in first position this is a title line for printed outp. +C ----------------------------------------------------------- + PARAMETER (MAXTITLE=5) + COMMON/TITLE/NTITLEMX,NTITLE,TITLE(MAXTITLE) + CHARACTER*80 TITLE + CHARACTER*(*) C,PROMPT +C + LENGTH=LEN(C) +C + 10 WRITE(6,1000) PROMPT + 1000 FORMAT(/A,$) +C 1000 FORMAT(/' INPUT FLAG > ',$) +C note:"$": it's a "Vax Fortran Extension" way to give a prompt + READ(5,1100,ERR=500,END=600)C + 1100 FORMAT(A) +C ........... vax fortran way to create a subprocess + IF(C(1:1).EQ.'$') THEN + C=C(2:) + ISTATUS=LIB$SPAWN(C) + GOTO 10 +C ............ the line is skipped as a comment + ELSE IF(C(1:1).EQ.'!') THEN +C Title line inserted in common + IF(C(2:2).EQ.'!'.AND.NTITLE.LT.NTITLEMX) THEN + NTITLE=NTITLE+1 + TITLE(NTITLE)=C(3:) + ENDIF + GOTO 10 + ENDIF +C + KF=0 + DO 20 I=1,LENGTH + IF(C(I:I).EQ.'?') THEN + KF=1 + RETURN + ENDIF + IF(C(I:I).GE.'a'.AND.C(I:I).LE.'z') THEN + IC=ICHAR(C(I:I)) + IC=IC-32 + C(I:I)=CHAR(IC) +C 1 C(I:I)=CHAR(ICHAR(C(I:I))+32) +C 1 C(I:I)=CHAR(IAND( ICHAR(C(I:I)) , '5F'X ) ) Maybe faster + ENDIF + 20 CONTINUE +C + RETURN + 600 WRITE(6,6000) + 6000 FORMAT(' ERROR: EOF ENCOUNTERED READING INPUT ') + GOTO 10 + 500 WRITE(6,5000) + 5000 FORMAT(' ERROR READING INPUT! Format is A80 Reenter.') + GOTO 10 + END +C diff --git a/code/f.tex b/code/f.tex new file mode 100755 index 0000000..2ac36a8 --- /dev/null +++ b/code/f.tex @@ -0,0 +1,203 @@ +% TEX - MACRO DI USO GENERALE - 23 - 8 -88 - M.GALLI +% DEFINIZIONE DEI FORMATI A 8-9-10-12 PUNTI +% ------------------------------------------------------------ +% Macros dal "The TeXbook" (file tex$disk:[tex.texams.doc]manmac.tex) +% con varianti introdotto per fonts tutti a 12 punti ,10-9-8 + +\catcode`@=11 % borrow the private macros of PLAIN (with care) + +% fonts a dodici punti per il \twelvepoints +\font\twelverm=cmr12 +\font\twelvei=cmmi12 +\font\twelvesy=cmsy10 scaled \magstep1 % at 12 pt - scaled 1200 +\font\twelveex=cmex10 scaled \magstep1 +\font\twelvebf=cmbx12 +\font\twelvesl=cmsl12 +\font\twelvett=cmtt12 +\font\twelveit=cmti12 + +% fonts a nove punti per il \twelvepoints +%\font\nineex=cmtex9 % uso invece il 10 sotto + +% fonts a sette punti per il \twelvepionts +\font\sevenei=cmmi7 + +\font\tentex=cmtex10 + +\font\inchhigh=cminch +\font\titlefont=cmssdc10 at 40pt + +\font\ninerm=cmr9 +\font\eightrm=cmr8 +\font\sixrm=cmr6 + +\font\ninei=cmmi9 +\font\eighti=cmmi8 +\font\sixi=cmmi6 +\skewchar\ninei='177 \skewchar\eighti='177 \skewchar\sixi='177 + +\font\ninesy=cmsy9 +\font\eightsy=cmsy8 +\font\sixsy=cmsy6 +\skewchar\ninesy='60 \skewchar\eightsy='60 \skewchar\sixsy='60 + +\font\eightss=cmssq8 + +\font\eightssi=cmssqi8 + +\font\ninebf=cmbx9 +\font\eightbf=cmbx8 +\font\sixbf=cmbx6 + +\font\ninett=cmtt9 +\font\eighttt=cmtt8 + +\hyphenchar\tentt=-1 % inhibit hyphenation in typewriter type +\hyphenchar\ninett=-1 +\hyphenchar\eighttt=-1 + +\font\ninesl=cmsl9 +\font\eightsl=cmsl8 + +\font\nineit=cmti9 +\font\eightit=cmti8 + +%\font\tenu=cmu10 % unslanted text italic +%\font\magnifiedfiverm=cmr5 at 10pt +%\font\manual=manfnt % font used for the METAFONT logo, etc. +%\font\cmman=cmman % font used for miscellaneous Computer Modern variations + +\newskip\ttglue +\def\twelvepoint{\def\rm{\fam0\twelverm}% + \textfont0=\twelverm \scriptfont0=\ninerm \scriptscriptfont0=\sevenrm + \textfont1=\twelvei \scriptfont1=\ninei \scriptscriptfont1=\sevenei + \textfont2=\twelvesy \scriptfont2=\ninesy \scriptscriptfont2=\sevensy + \textfont3=\twelveex \scriptfont3=\twelveex \scriptscriptfont3=\twelveex + \def\it{\fam\itfam\twelveit}% + \textfont\itfam=\twelveit + \def\sl{\fam\slfam\twelvesl}% + \textfont\slfam=\twelvesl + \def\bf{\fam\bffam\twelvebf}% + \textfont\bffam=\twelvebf \scriptfont\bffam=\ninebf + \scriptscriptfont\bffam=\sevenbf + \def\tt{\fam\ttfam\twelvett}% + \textfont\ttfam=\twelvett + \tt \ttglue=.7em plus.27em minus.17em + \normalbaselineskip=16pt +% \def\MF{{\manual META}\-{\manual FONT}}% + \let\sc=\tenrm + \let\big=\twelvebig + \setbox\strutbox=\hbox{\vrule height9pt depth4pt width\z@}% + \normalbaselines\rm} + +\def\tenpoint{\def\rm{\fam0\tenrm}% + \textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm + \textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei + \textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy + \textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex + \def\it{\fam\itfam\tenit}% + \textfont\itfam=\tenit + \def\sl{\fam\slfam\tensl}% + \textfont\slfam=\tensl + \def\bf{\fam\bffam\tenbf}% + \textfont\bffam=\tenbf \scriptfont\bffam=\sevenbf + \scriptscriptfont\bffam=\fivebf + \def\tt{\fam\ttfam\tentt}% + \textfont\ttfam=\tentt + \tt \ttglue=.5em plus.25em minus.15em + \normalbaselineskip=12pt + \def\MF{{\manual META}\-{\manual FONT}}% + \let\sc=\eightrm + \let\big=\tenbig + \setbox\strutbox=\hbox{\vrule height8.5pt depth3.5pt width\z@}% + \normalbaselines\rm} + +\def\ninepoint{\def\rm{\fam0\ninerm}% + \textfont0=\ninerm \scriptfont0=\sixrm \scriptscriptfont0=\fiverm + \textfont1=\ninei \scriptfont1=\sixi \scriptscriptfont1=\fivei + \textfont2=\ninesy \scriptfont2=\sixsy \scriptscriptfont2=\fivesy + \textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex + \def\it{\fam\itfam\nineit}% + \textfont\itfam=\nineit + \def\sl{\fam\slfam\ninesl}% + \textfont\slfam=\ninesl + \def\bf{\fam\bffam\ninebf}% + \textfont\bffam=\ninebf \scriptfont\bffam=\sixbf + \scriptscriptfont\bffam=\fivebf + \def\tt{\fam\ttfam\ninett}% + \textfont\ttfam=\ninett + \tt \ttglue=.5em plus.25em minus.15em + \normalbaselineskip=11pt + \def\MF{{\manual hijk}\-{\manual lmnj}}% + \let\sc=\sevenrm + \let\big=\ninebig + \setbox\strutbox=\hbox{\vrule height8pt depth3pt width\z@}% + \normalbaselines\rm} + +\def\eightpoint{\def\rm{\fam0\eightrm}% + \textfont0=\eightrm \scriptfont0=\sixrm \scriptscriptfont0=\fiverm + \textfont1=\eighti \scriptfont1=\sixi \scriptscriptfont1=\fivei + \textfont2=\eightsy \scriptfont2=\sixsy \scriptscriptfont2=\fivesy + \textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex + \def\it{\fam\itfam\eightit}% + \textfont\itfam=\eightit + \def\sl{\fam\slfam\eightsl}% + \textfont\slfam=\eightsl + \def\bf{\fam\bffam\eightbf}% + \textfont\bffam=\eightbf \scriptfont\bffam=\sixbf + \scriptscriptfont\bffam=\fivebf + \def\tt{\fam\ttfam\eighttt}% + \textfont\ttfam=\eighttt + \tt \ttglue=.5em plus.25em minus.15em + \normalbaselineskip=9pt + \def\MF{{\manual opqr}\-{\manual stuq}}% + \let\sc=\sixrm + \let\big=\eightbig + \setbox\strutbox=\hbox{\vrule height7pt depth2pt width\z@}% + \normalbaselines\rm} + +\def\tenmath{\tenpoint\fam-1 } % use after $ in ninepoint sections + +% aggiungo il grande 12 +\def\twelvebig#1{{\hbox{$\left#1\vbox to9pt{}\right.\n@space$}}} + +\def\tenbig#1{{\hbox{$\left#1\vbox to8.5pt{}\right.\n@space$}}} +\def\ninebig#1{{\hbox{$\textfont0=\tenrm\textfont2=\tensy + \left#1\vbox to7.25pt{}\right.\n@space$}}} +\def\eightbig#1{{\hbox{$\textfont0=\ninerm\textfont2=\ninesy + \left#1\vbox to6.5pt{}\right.\n@space$}}} + +% fine macro del texbook +% ------------------------------------------------------------- +% +\font\ftit=CMr17 % titoli roman 17 punti +\font\ftitp=cmr12 % titoletti roman 12 punti +% +\font\fmain=CMR12 % testo in roman 12 punti +\font\fmaing=CMBX12 % testo grassetto +\font\fmainp=CMR9 % roman 9 punti +% +%\font\fita=CMTI12 % italico +% +%\baselineskip=18pt +\hsize=5.5in % 6.5in default +%\vsize=7.9in % 8.9in default +%\voffset=1in +\hoffset=0.5in +% +\nopagenumbers % niente numerazione +\raggedbottom % tolleranza in basso +%\topskip10pt plus90pt minus90pt %colla in alto per 3 righe di tolleranza +\topskip 2.5cm plus1cm minus0cm +\hyphenpenalty=1000 % smettila di hyphennare in inglese! +\pretolerance=400 % tollera righe bruttine prima di hyphennare +\tolerance=1000 % tollera brutte righe prima di lamentarsi +\raggedright % tolleranza a destra +\hfuzz=30pt % le overfull fino a 30pt vanno bene lo stesso +\overfullrule=0pt % niente scarabocchio che segnala overfull +% +\def\fine{\par\vfill\end} +\def\capo{\par\noindent} +% +% +\endinput diff --git a/code/missfont.log b/code/missfont.log new file mode 100644 index 0000000..2b11d75 --- /dev/null +++ b/code/missfont.log @@ -0,0 +1,8 @@ +mktextfm CMr17 +mktextfm CMR12 +mktextfm CMBX12 +mktextfm CMR9 +mktextfm CMr17 +mktextfm CMR12 +mktextfm CMBX12 +mktextfm CMR9 diff --git a/code/test1.com b/code/test1.com new file mode 100755 index 0000000..77f8a40 --- /dev/null +++ b/code/test1.com @@ -0,0 +1,44 @@ +$ set verify +$! TEST STANDARD NUMERO 1: 1 STELLA RAGGIO 1, T=1,X0=1 => L=PI +$! Not normalized ! +$! CBS con ntheta=51-101 +$ bin +$ run cbs +stara +mesha +51 +x0a +0 +ra +1 +TEMPA +1 +BOLA +0 +print +amount +4 +reflection +0 +map +100000 +unit +0 +phasegrid +numcells +50 +OFF +starb +reflection +OFF +go +STARA +mesha +101 +GO +stop +$! +$! TEST STANDARD NUMERO 1: 1 STELLA RAGGIO 1, T=1,X0=1 => L=PI +$! Not normalized ! +$! CBS con ntheta=51-101 +$! diff --git a/code/test2.com b/code/test2.com new file mode 100755 index 0000000..8a423dc --- /dev/null +++ b/code/test2.com @@ -0,0 +1,71 @@ +$ BIN +$ run cbs +!! TEST NUMERO 2: +!! STELLE SFERICHE RAGGI: 1,2 POSIZIONE CENTRI X0=-2,2 +!! TEMPERATURA : T=1 => Luminosita' non normalizzate, = superfici: pi, 4*pi. +!! Con questi parametri si dovrebbe avere precisione migliore dell'1% +STARA +mesha +100 +x0a +-2.0 +y0a +0.0 +z0a +0.0 +ra +1 +tempa +1 +bola +0 +corda +3. +alba +1. +STARB +meshb +200 +x0b +2.0 +y0b +0.0 +z0b +0.0 +rb +2 +tempb +1 +bolb +0 +albb +1. +cordb +3. +PRINT +amount +4 +refl +0 +light +0 +map +100000 +unit +0 +GRID +numcells +1000 +REFLECTION +coarse +5 +maxiter +5 +precision +0.000001 +!OFF +!reflection +!OFF +GO +STOP +$! FINE PROCEDURA diff --git a/code/test3.com b/code/test3.com new file mode 100755 index 0000000..0616918 --- /dev/null +++ b/code/test3.com @@ -0,0 +1,51 @@ +$ set verify +$! TEST STANDARD NUMERO 3 : 1 DISCO RAGGIO 1, T=1,X0=0, BOL=0 +$! => L=PI di faccia, luce=4 di bordo , (4+pi)*cos 45 a 45 gradi. +$! il disco e' inclinato e ruotato in modo da essere visto di +$! taglio a fase 0, di faccia a fase 0.25. +$ bin +$ run cbs +reflection +coarse +1 +off +stara +starb +reflection +off +DISK +meshc +50 +ric +0 +rc +1 +hc +2 +hic +2 +bolc +0 +inner +0 +inclinc +90 +rotatec +90 +tempc +1 +PRINT +amount +4 +map +10000 +unit +0 +GRID +numcells +50 +GO +stop +$! +$! TEST STANDARD NUMERO 3 disco raggio 1 alto 2 +$! diff --git a/code/test4.com b/code/test4.com new file mode 100755 index 0000000..533a004 --- /dev/null +++ b/code/test4.com @@ -0,0 +1,58 @@ +$ set verify +$! TEST STANDARD NUMERO 4 : 1 DISCO RAGGIO 1, T=1,X0=0, BOL=0 +$! SPESSO 2 AL BORDO, 0 AL CENTRO. +$! => L=PI/COS45 di faccia, luce=4 di bordo , (4)*cos 45+PI a 45 gradi. +$! il disco e' inclinato e ruotato in modo da essere visto di +$! taglio a fase 0, di faccia a fase 0.25. +$ bin +$ run cbs +! +reflection +coarse +1 +! +off +stara +starb +reflection +off +! +DISK +meshc +1 +ric +0 +rc +1 +hc +2 +hic +0 +bolc +0 +inner +0 +inclinc +90 +rotatec +90 +tempc +1 +! +GRID +numcells +50 +! +PRINT +amount +4 +map +10000 +unit +0 +! +GO +STOP +$! +$! TEST STANDARD NUMERO 3 disco raggio 1 alto 2 +$! diff --git a/code/test5.com b/code/test5.com new file mode 100755 index 0000000..f214486 --- /dev/null +++ b/code/test5.com @@ -0,0 +1,94 @@ +$ set verify +$! 2 QUADRATI di 4 punt1, lato 2, uno lucente, uno buio, a distanza 1. +$! 1 RETTANGOLO DI 1 PUNTO, LATO 1 +$ bin +$ run cbs +reflection +coarse +1 +maxiter +5 +PRECISION +0.00000001 +! +STARA +MESHA +2 +SHAPEA +0. +RA +1.0 +X0A +1.0 +BOLA +0 +TEMPA +1 +INNERA +1. +INCLINA +90. +! +STARB +MESHB +2 +SHAPEB +0. +RB +1. +X0B +-1.0 +BOLB +0 +TEMPB +0 +INNERB +1. +INCLINB +90 +! +DISK +shapec +0.0 +meshc +1. +rc +0.5 +x0c +0. +y0c +-0.5 +z0c + 0.5 +BOLc +0 +TEMPc +0 +INNERc +1. +INCLINc +90 +! +PRINT +amount +1000 +map +1 +unit +11 +refl +100 +light +100 +! +GRID +numcells +10 +! +!OFF +!disk +!off +! +GO +stop +$EXIT diff --git a/code/test6.com b/code/test6.com new file mode 100755 index 0000000..07b2031 --- /dev/null +++ b/code/test6.com @@ -0,0 +1,99 @@ + +$ set verify +$! 2 STELLE EGUALI, ROCHE MODEL +$ bin +$ run cbs +! Stella A in 0,0,0, +STARA +shapea +2. +RA +0.5 +x0a +0. +y0a +0. +z0a +0. +omegaa +0. +mesha +13. +tempa +1. +bola +0. +corda +3. +! Stella B in 1,0,0 +STARB +shapeb +2. +RB +0.5 +x0b +1. +y0b +0. +z0b +0. +omegab +0. +meshb +13. +tempb +1. +bolb +0. +cordb +3. +! COARSE = num fini +reflection +coarse +1. +maxiter +5. +! +ORBIT +MRATIO +1. +PREC +0.00001 +! +GRID +numcells +20. +! +OFF +REFLECTION +DISK +OFF +! +! full printing: +PRINT +amount +1000 +map +1 +unit +11 +refl +100 +light +100 +! +GO +! little printing +PRINT +amount +4 +map +10000 +unit +11 +refl +0 +light +0 +STOP +$EXIT diff --git a/code/test7.com b/code/test7.com new file mode 100755 index 0000000..b65933c --- /dev/null +++ b/code/test7.com @@ -0,0 +1,107 @@ +$ set verify +$!! CASO DI A.A. Suppl. 55 : 403 (84) +$!! prova A : roche noreflection nogravity nolimb +$ bin +$ run cbs +! Stella A in 0,0,0, ( la h ) +STARA +shapea +2. +RA +0.18 +omegaa +5.983 +!betaa +!0.08 +tempa +19000. +!limba +!0.36 +x0a +0. +y0a +0. +z0a +0. +mesha +111. +bola +0. +corda +3. +! Stella B in 1,0,0 +STARB +shapeb +2. +RB +0.0 +!0.3 +x0b +1. +y0b +0. +z0b +0. +omegab +2.738 +!betab +!0.08 +!limbb +!0.55 +meshb +111. +tempb +10145. +bolb +0. +cordb +3. +! COARSE +REFLECTION +coarse +11. +maxiter +1. +! +ORBIT +I +77.3 +mratio +0.43 +prec +0.00001 +! +PHASES +numphases +100. +norm +1. +GRID +numcells +1000. +! +OFF +REFLECTION +DISK +OFF +! +! printing: +PRINT +amount +4 +map +0 +unit +11 +refl +0 +light +0 +! +plot +file +12 +! +GO +STOP +$EXIT diff --git a/code/test9.com b/code/test9.com new file mode 100755 index 0000000..5397544 --- /dev/null +++ b/code/test9.com @@ -0,0 +1,149 @@ +$ set verify +$ bin +$ run cbs +!! TEST 9 : IM aur - parametri da J.B. Rafert - A.J. 100:1523(90) +!! contro dati sperimentali di ? +! A Object in 0,0,0, +STARA +mesha +111. +x0a +0. +y0a +0. +z0a +0. +shapea +2. +ra +0.0 +omegaa +3.103 +ga +0.63 +tempa +12000. +limba +0.75 +alba +1. +!bola +!0.9427 +corda +3. +! Stella B in 1,0,0 ( la 2 ) +STARB +meshb +111. +x0b +1. +y0b +0. +z0b +0. +shapeb +2. +RB +0.0 +omegab +2.4913 +gb +0.32 +limbb +0.675 +tempb +5954. +albb +0.8 +!bolb +!0.0573 +cordb +3. +! COLORS +U +Ulamb1 +3600. +Ulamb2 +3600. +Ulum_a +-1. +Ulum_b +-1. +B +Blamb1 +4250. +Blamb2 +4250. +Blum_a +-1. +Blum_b +-1. +V +Vlamb1 +5410. +Vlamb2 +5410. +vlum_a +-1. +vlum_b +-1. +R +Rlamb1 +7000. +Rlamb2 +7000. +Rlum_a +-1. +Rlum_b +-1. +! COARSE +REFLECTION +coarse +5. +maxiter +5. +precision +1.E-6 +! +ORBIT +I +75.21 +mratio +0.3114 +prec +0.00001 +! +PHASES +numphases +100. +norm +1. +GRID +numcells +200. +! +OFF +!REFLECTION +DISK +OFF +! +! printing: +PRINT +amount +4 +map +0 +unit +11 +refl +0 +light +0 +! +plot +file +12 +! +GO +STOP +$EXIT diff --git a/code/test9.log b/code/test9.log new file mode 100755 index 0000000..cb947cf --- /dev/null +++ b/code/test9.log @@ -0,0 +1,556 @@ +$! +$!------------------------------------------------------------------------- +$! SYLOGIN.COM 7-12-89 +$!------------------------------------------------------------------------- +$ set noverify + +---------------------------------------------------------------------- + ATTENZIONE ! ATTENZIONE ! ATTENZIONE ! ATTENZIONE ! ATTENZIONE ! + +Il Microvax non ce la fa piu' a reggere il cluster ...... + +Forse e' la fine.... ma forse no: +stiamo lavorando con una configurazione di fortuna, che adesso va. + +Non e' attivo l'SNA per collegamento con IBM ( ma interlink va ) +Non e' attivo il Pathwork per collegare Personal MS-DOS e MAC. + +DA UN MOMENTO ALL'ALTRO SI PUO' BLOCCARE TUTTO, SENZA PREAVVISO ! + AUGURI..... + +--------------------------------------------------------------------- + + 5-MAY-1993 10:29:25 + Now MARC login procedure executing ! + +$ bin +$ run cbs + CLOSE BINARY SYSTEM ANALYSIS PROGRAM + Version 0.0 ( debugging in progress ) + + + +INPUT FLAG > +!! TEST 9 : IM aur - parametri da J.B. Rafert - A.J. 100:1523(90) + +INPUT FLAG > +!! contro dati sperimentali di ? + +INPUT FLAG > +! A Object in 0,0,0, + +INPUT FLAG > +STARA +Set on: flag number: 1 STARA Star A + +INPUT PARAMETER > +mesha +VALUE > +111. +Parameter number: 7 MESHA num. of theta mesh = 111.0000 + +INPUT PARAMETER > +x0a +VALUE > +0. +Parameter number: 3 X0A X position of A = 0.0000000E+00 + +INPUT PARAMETER > +y0a +VALUE > +0. +Parameter number: 4 Y0A Y position of A = 0.0000000E+00 + +INPUT PARAMETER > +z0a +VALUE > +0. +Parameter number: 5 Z0A Z position of A = 0.0000000E+00 + +INPUT PARAMETER > +shapea +VALUE > +2. +Parameter number: 1 SHAPEA sphere=1,roche=2 = 2.000000 + +INPUT PARAMETER > +ra +VALUE > +0.0 +Parameter number: 2 RA radius of star A = 0.0000000E+00 + +INPUT PARAMETER > +omegaa +VALUE > +3.103 +Parameter number: 6 OMEGAA potential of A = 3.103000 + +INPUT PARAMETER > +ga +VALUE > +0.63 +Parameter number: 9 GA gravity dark. of A = 0.6300000 + +INPUT PARAMETER > +tempa +VALUE > +12000. +Parameter number: 10 TEMPA pole temperature A = 12000.00 + +INPUT PARAMETER > +limba +VALUE > +0.75 +Parameter number: 13 LIMBA limb darkening of A = 0.7500000 + +INPUT PARAMETER > +alba +VALUE > +1. +Parameter number: 12 ALBA bolometric albedo A = 1.000000 + +INPUT PARAMETER > +!bola + +INPUT PARAMETER > +!0.9427 + +INPUT PARAMETER > +corda +VALUE > +3. +Parameter number: 14 CORDA arch,cord,tang.seg. = 3.000000 + +INPUT PARAMETER > +! Stella B in 1,0,0 ( la 2 ) + +INPUT PARAMETER > +STARB +Set on: flag number: 2 STARB Star B + +INPUT PARAMETER > +meshb +VALUE > +111. +Parameter number: 27 MESHB num. of theta mesh = 111.0000 + +INPUT PARAMETER > +x0b +VALUE > +1. +Parameter number: 23 X0B X position of B = 1.000000 + +INPUT PARAMETER > +y0b +VALUE > +0. +Parameter number: 24 Y0B Y position of B = 0.0000000E+00 + +INPUT PARAMETER > +z0b +VALUE > +0. +Parameter number: 25 Z0B Z position of B = 0.0000000E+00 + +INPUT PARAMETER > +shapeb +VALUE > +2. +Parameter number: 21 SHAPEB sphere=1,roche=2 = 2.000000 + +INPUT PARAMETER > +RB +VALUE > +0.0 +Parameter number: 22 RB radius of star B = 0.0000000E+00 + +INPUT PARAMETER > +omegab +VALUE > +2.4913 +Parameter number: 26 OMEGAB potential of B = 2.491300 + +INPUT PARAMETER > +gb +VALUE > +0.32 +Parameter number: 29 GB gravity dark. of B = 0.3200000 + +INPUT PARAMETER > +limbb +VALUE > +0.675 +Parameter number: 33 LIMBB limb darkening of B = 0.6750000 + +INPUT PARAMETER > +tempb +VALUE > +5954. +Parameter number: 30 TEMPB pole temperature B = 5954.000 + +INPUT PARAMETER > +albb +VALUE > +0.8 +Parameter number: 32 ALBB bolometric albedo B = 0.8000000 + +INPUT PARAMETER > +!bolb + +INPUT PARAMETER > +!0.0573 + +INPUT PARAMETER > +cordb +VALUE > +3. +Parameter number: 34 CORDB arch,cord,tang.seg. = 3.000000 + +INPUT PARAMETER > +! COLORS + +INPUT PARAMETER > +U +Set on: flag number: 4 U U-color band + +INPUT PARAMETER > +Ulamb1 +VALUE > +3600. +Parameter number: 61 ULAMB1 U color lambda 1 = 3600.000 + +INPUT PARAMETER > +Ulamb2 +VALUE > +3600. +Parameter number: 62 ULAMB2 U color lambda 2 = 3600.000 + +INPUT PARAMETER > +Ulum_a +VALUE > +-1. +Parameter number: 63 ULUM_A frac. U lumin.for A = -1.000000 + +INPUT PARAMETER > +Ulum_b +VALUE > +-1. +Parameter number: 64 ULUM_B frac. U lumin.for B = -1.000000 + +INPUT PARAMETER > +B +Set on: flag number: 5 B B-color band + +INPUT PARAMETER > +Blamb1 +VALUE > +4250. +Parameter number: 69 BLAMB1 B color lambda 1 = 4250.000 + +INPUT PARAMETER > +Blamb2 +VALUE > +4250. +Parameter number: 70 BLAMB2 B color lambda 2 = 4250.000 + +INPUT PARAMETER > +Blum_a +VALUE > +-1. +Parameter number: 71 BLUM_A frac. B lumin.for A = -1.000000 + +INPUT PARAMETER > +Blum_b +VALUE > +-1. +Parameter number: 72 BLUM_B frac. B lumin.for B = -1.000000 + +INPUT PARAMETER > +V +Set on: flag number: 6 V V-color band + +INPUT PARAMETER > +Vlamb1 +VALUE > +5410. +Parameter number: 77 VLAMB1 V color lambda 1 = 5410.000 + +INPUT PARAMETER > +Vlamb2 +VALUE > +5410. +Parameter number: 78 VLAMB2 V color lambda 2 = 5410.000 + +INPUT PARAMETER > +vlum_a +VALUE > +-1. +Parameter number: 79 VLUM_A frac. V lumin.for A = -1.000000 + +INPUT PARAMETER > +vlum_b +VALUE > +-1. +Parameter number: 80 VLUM_B frac. V lumin.for B = -1.000000 + +INPUT PARAMETER > +R +Set on: flag number: 7 R R-color band + +INPUT PARAMETER > +Rlamb1 +VALUE > +7000. +Parameter number: 85 RLAMB1 R color lambda 1 = 7000.000 + +INPUT PARAMETER > +Rlamb2 +VALUE > +7000. +Parameter number: 86 RLAMB2 R color lambda 2 = 7000.000 + +INPUT PARAMETER > +Rlum_a +VALUE > +-1. +Parameter number: 87 RLUM_A frac. R lumin.for A = -1.000000 + +INPUT PARAMETER > +Rlum_b +VALUE > +-1. +Parameter number: 88 RLUM_B frac. R lumin.for B = -1.000000 + +INPUT PARAMETER > +! COARSE + +INPUT PARAMETER > +REFLECTION +Set on: flag number: 9 REFLECTION Reflection comput. + +INPUT PARAMETER > +coarse +VALUE > +5. +Parameter number: 104 COARSE coarsing factor = 5.000000 + +INPUT PARAMETER > +maxiter +VALUE > +5. +Parameter number: 102 MAXITER maximum iteration = 5.000000 + +INPUT PARAMETER > +precision +VALUE > +1.E-6 +Parameter number: 103 PRECISION convergency check = 0.1000000E-05 + +INPUT PARAMETER > +! + +INPUT PARAMETER > +ORBIT +Set on: flag number: 11 ORBIT Orbital parameters + +INPUT PARAMETER > +I +VALUE > +75.21 +Parameter number: 105 I incl.of orbit plane = 75.21000 + +INPUT PARAMETER > +mratio +VALUE > +0.3114 +Parameter number: 106 MRATIO mass ratio Mb/Ma = 0.3114000 + +INPUT PARAMETER > +prec +VALUE > +0.00001 +Parameter number: 108 PREC Newton-Rapson prec. = 0.1000000E-04 + +INPUT PARAMETER > +! + +INPUT PARAMETER > +PHASES +Set on: flag number: 12 PHASES Sets phases + +INPUT PARAMETER > +numphases +VALUE > +100. +Parameter number: 111 NUMPHASES num.of equis.phases = 100.0000 + +INPUT PARAMETER > +norm +VALUE > +1. +Parameter number: 113 NORM Light curve norm. = 1.000000 + +INPUT PARAMETER > +GRID +Set on: flag number: 13 GRID Sets project.grid + +INPUT PARAMETER > +numcells +VALUE > +200. +Parameter number: 114 NUMCELLS num.of grid points = 200.0000 + +INPUT PARAMETER > +! + +INPUT PARAMETER > +OFF +Set on: flag number: 19 OFF Set next flags off + +INPUT FLAG > +!REFLECTION + +INPUT FLAG > +DISK +Set off: flag number: 3 DISK Disk + +INPUT FLAG > +OFF +Set off: flag number: 19 OFF Set next flags off + +INPUT FLAG > +! + +INPUT FLAG > +! printing: + +INPUT FLAG > +PRINT +Set on: flag number: 20 PRINT Output is printed + +INPUT PARAMETER > +amount +VALUE > +4 +Parameter number: 117 AMOUNT Amount of printing = 4.000000 + +INPUT PARAMETER > +map +VALUE > +0 +Parameter number: 120 MAP Map print phas.step = 0.0000000E+00 + +INPUT PARAMETER > +unit +VALUE > +11 +Parameter number: 119 UNIT Output on this unit = 11.00000 + +INPUT PARAMETER > +refl +VALUE > +0 +Parameter number: 121 REFL Reflection details = 0.0000000E+00 + +INPUT PARAMETER > +light +VALUE > +0 +Parameter number: 122 LIGHT Light curve details = 0.0000000E+00 + +INPUT PARAMETER > +! + +INPUT PARAMETER > +plot +Set on: flag number: 21 PLOT Plot produced + +INPUT PARAMETER > +file +VALUE > +12 +Parameter number: 127 FILE Output ASCII file = 12.00000 + +INPUT PARAMETER > +! + +INPUT PARAMETER > +GO +Set on: flag number: 15 GO Program runs + +Elapsed time for I/O: 2.7891 Total: 2.7891 + + +Computed Lagrange points and potential for critical lobes: + L1= 0.6173010 omega= 2.491283 + L2= 1.505044 omega= 2.297606 + L3=-0.8606350 omega= 2.082969 + + +Surface-X axis intersection for object: 1 computed as: 0.3812175 -0.3748645 +Surface drawing starts from point: 0.3812175 + + +Elapsed time for surface drawing: 54.270 Total: 54.270 + + +Surface-X axis intersection for object: 2 computed as: 0.6173010 1.307500 +Surface drawing starts from point: 1.307500 + + +Elapsed time for surface drawing: 52.570 Total: 106.84 + + +Elapsed time for reflection: 117.36 Total: 117.36 + + +Elapsed time for color band: 10.371 Total: 10.371 + + +Elapsed time for color band: 8.5000 Total: 18.871 + + +Elapsed time for color band: 8.4102 Total: 27.281 + + +Elapsed time for color band: 8.2109 Total: 35.492 + + +Elapsed time for color band: 7.9688 Total: 43.461 + + +Elapsed time for color band: 8.3281 Total: 51.789 + + +Elapsed time for color band: 9.0625 Total: 60.852 + + +Elapsed time for color band: 8.0703 Total: 68.922 + + +Elapsed time for flux normalization: 0.58594E-01 Total: 0.58594E-01 + +Sub.LUCE1: beginning phase: 1 : 0.00000E+00 elapsed time for last phase: 0.0000000E+00 +Sub.LUCE1: beginning phase: 2 : 0.62832E-01 elapsed time for last phase: 21.66016 +Sub.LUCE1: beginning phase: 3 : 0.12566 elapsed time for last phase: 19.20313 +Sub.LUCE1: beginning phase: 4 : 0.18850 elapsed time for last phase: 18.33984 +Sub.LUCE1: beginning phase: 5 : 0.25133 elapsed time for last phase: 18.29688 +Sub.LUCE1: beginning phase: 6 : 0.31416 elapsed time for last phase: 18.37109 +Sub.LUCE1: beginning phase: 7 : 0.37699 elapsed time for last phase: 18.10156 +Sub.LUCE1: beginning phase: 8 : 0.43982 elapsed time for last phase: 18.43750 +Sub.LUCE1: beginning phase: 9 : 0.50265 elapsed time for last phase: 18.92969 +Sub.LUCE1: beginning phase: 10 : 0.56549 elapsed time for last phase: 22.32031 +Sub.LUCE1: beginning phase: 11 : 0.62832 elapsed time for last phase: 20.26172 +Sub.LUCE1: beginning phase: 12 : 0.69115 elapsed time for last phase: 19.32813 +Sub.LUCE1: beginning phase: 13 : 0.75398 elapsed time for last phase: 18.80078 +Sub.LUCE1: beginning phase: 14 : 0.81681 elapsed time for last phase: 24.69141 +Sub.LUCE1: beginning phase: 15 : 0.87965 elapsed time for last phase: 22.73828 +Sub.LUCE1: beginning phase: 16 : 0.94248 elapsed time for last phase: 27.88281 +Sub.LUCE1: beginning phase: 17 : 1.0053 elapsed time for last phase: 26.36719 +Sub.LUCE1: beginning phase: 18 : 1.0681 elapsed time for last phase: 23.17188 +Sub.LUCE1: beginning phase: 19 : 1.1310 elapsed time for last phase: 29.46094 +Sub.LUCE1: beginning phase: 20 : 1.1938 elapsed time for last phase: 31.43750 +Sub.LUCE1: beginning phase: 21 : 1.2566 elapsed time for last phase: 26.33984 +Sub.LUCE1: beginning phase: 22 : 1.3195 elapsed time for last phase: 33.19141 +Sub.LUCE1: beginning phase: 23 : 1.3823 elapsed time for last phase: 24.71875 +Sub.LUCE1: beginning phase: 24 : 1.4451 elapsed time for last phase: 25.76953 diff --git a/code/vt3.com b/code/vt3.com new file mode 100755 index 0000000..42c5a34 --- /dev/null +++ b/code/vt3.com @@ -0,0 +1,114 @@ +$ set verify +$!! TEST 8 : CASO VT3 DI A.A. 197:347 (88) +$!! Impongo lobi quasi critici +$ bin +$ run cbs +! A Object in 0,0,0, ( object 1 ) +STARA +mesha +111. +x0a +0. +y0a +0. +z0a +0. +shapea +2. +ra +0.0 +omegaa +0.0 +!2.876 +ga +0.32 +tempa +5000. +limba +0.66 +bola +0. +corda +3. +! Stella B in 1,0,0 ( la 2 ) +STARB +meshb +111. +x0b +1. +y0b +0. +z0b +0. +shapeb +2. +RB +0.0 +omegab +0.0 +!2.876 +!3.637 + 0.5 (q**2/(1+q)) +gb +0.32 +limbb +0.66 +tempb +5362. +bolb +0. +cordb +3. +U +ulamb1 +5300 +ulamb2 +5300 +! COARSE +REFLECTION +coarse +1 +maxiter +1. +! +ORBIT +I +70.92 +mratio +0.5 +prec +0.00001 +! +PHASES +numphases +100. +norm +1. +GRID +numcells +200. +! +OFF +REFLECTION +DISK +OFF +! +! printing: +PRINT +amount +4 +map +0 +unit +11 +refl +0 +light +0 +! +plot +file +12 +! +GO +STOP +$EXIT diff --git a/code/vt3.log b/code/vt3.log new file mode 100755 index 0000000..41de0da --- /dev/null +++ b/code/vt3.log @@ -0,0 +1,759 @@ +$ set noverify + + Sylogin.com executing, node ebo530 + + + 5-MAR-1992 12:05:08 + Now MARC login procedure executing on EBO530 + +$!! TEST 8 : CASO VT3 DI A.A. 197:347 (88) +$!! Impongo lobi quasi critici +$ bin +$ run cbs + CLOSE BINARY SYSTEM ANALYSIS PROGRAM + Version 0.0 ( debugging in progress ) + + + +INPUT FLAG > +! A Object in 0,0,0, ( object 1 ) + +INPUT FLAG > +STARA +Set on: flag number: 1 STARA Star A + +INPUT PARAMETER > +mesha +VALUE > +111. +Parameter number: 7 MESHA num. of theta mesh = 111.0000 + +INPUT PARAMETER > +x0a +VALUE > +0. +Parameter number: 3 X0A X position of A = 0.0000000E+00 + +INPUT PARAMETER > +y0a +VALUE > +0. +Parameter number: 4 Y0A Y position of A = 0.0000000E+00 + +INPUT PARAMETER > +z0a +VALUE > +0. +Parameter number: 5 Z0A Z position of A = 0.0000000E+00 + +INPUT PARAMETER > +shapea +VALUE > +2. +Parameter number: 1 SHAPEA sphere=1,roche=2 = 2.000000 + +INPUT PARAMETER > +ra +VALUE > +0.0 +Parameter number: 2 RA radius of star A = 0.0000000E+00 + +INPUT PARAMETER > +omegaa +VALUE > +2.876 +Parameter number: 6 OMEGAA potential of A = 2.876000 + +INPUT PARAMETER > +ga +VALUE > +0.32 +Parameter number: 9 GA gravity dark. of A = 0.3200000 + +INPUT PARAMETER > +tempa +VALUE > +5000. +Parameter number: 10 TEMPA medium temp. of A = 5000.000 + +INPUT PARAMETER > +limba +VALUE > +0.66 +Parameter number: 13 LIMBA limb darkening of A = 0.6600000 + +INPUT PARAMETER > +bola +VALUE > +0. +Parameter number: 11 BOLA bolometric lum.of A = 0.0000000E+00 + +INPUT PARAMETER > +corda +VALUE > +3. +Parameter number: 14 CORDA arch,cord,tang.seg. = 3.000000 + +INPUT PARAMETER > +! Stella B in 1,0,0 ( la 2 ) + +INPUT PARAMETER > +STARB +Set on: flag number: 2 STARB Star B + +INPUT PARAMETER > +meshb +VALUE > +111. +Parameter number: 27 MESHB num. of theta mesh = 111.0000 + +INPUT PARAMETER > +x0b +VALUE > +1. +Parameter number: 23 X0B X position of B = 1.000000 + +INPUT PARAMETER > +y0b +VALUE > +0. +Parameter number: 24 Y0B Y position of B = 0.0000000E+00 + +INPUT PARAMETER > +z0b +VALUE > +0. +Parameter number: 25 Z0B Z position of B = 0.0000000E+00 + +INPUT PARAMETER > +shapeb +VALUE > +2. +Parameter number: 21 SHAPEB sphere=1,roche=2 = 2.000000 + +INPUT PARAMETER > +RB +VALUE > +0.0 +Parameter number: 22 RB radius of star B = 0.0000000E+00 + +INPUT PARAMETER > +omegab +VALUE > +2.876 +Parameter number: 26 OMEGAB potential of B = 2.876000 + +INPUT PARAMETER > +!3.637 + 0.5 (q**2/(1+q)) + +INPUT PARAMETER > +gb +VALUE > +0.32 +Parameter number: 29 GB gravity dark. of B = 0.3200000 + +INPUT PARAMETER > +limbb +VALUE > +0.66 +Parameter number: 33 LIMBB limb darkening of B = 0.6600000 + +INPUT PARAMETER > +tempb +VALUE > +5000. +Parameter number: 30 TEMPB medium temp. of B = 5000.000 + +INPUT PARAMETER > +bolb +VALUE > +0. +Parameter number: 31 BOLB bolometric lum.of B = 0.0000000E+00 + +INPUT PARAMETER > +cordb +VALUE > +3. +Parameter number: 34 CORDB arch,cord,tang.seg. = 3.000000 + +INPUT PARAMETER > +U +Set on: flag number: 4 U U-color band + +INPUT PARAMETER > +ulamb1 +VALUE > +5300 +Parameter number: 61 ULAMB1 U color lambda 1 = 5300.000 + +INPUT PARAMETER > +ulamb2 +VALUE > +5300 +Parameter number: 62 ULAMB2 U color lambda 2 = 5300.000 + +INPUT PARAMETER > +! COARSE + +INPUT PARAMETER > +REFLECTION +Set on: flag number: 9 REFLECTION Reflection comput. + +INPUT PARAMETER > +coarse +VALUE > +1 +Parameter number: 104 COARSE coarsing factor = 1.000000 + +INPUT PARAMETER > +maxiter +VALUE > +1. +Parameter number: 102 MAXITER maximum iteration = 1.000000 + +INPUT PARAMETER > +! + +INPUT PARAMETER > +ORBIT +Set on: flag number: 11 ORBIT Orbital parameters + +INPUT PARAMETER > +I +VALUE > +70.92 +Parameter number: 105 I incl.of orbit plane = 70.92000 + +INPUT PARAMETER > +mratio +VALUE > +0.5 +Parameter number: 106 MRATIO mass ratio Mb/Ma = 0.5000000 + +INPUT PARAMETER > +prec +VALUE > +0.00001 +Parameter number: 108 PREC Newton-Rapson prec. = 0.1000000E-04 + +INPUT PARAMETER > +! + +INPUT PARAMETER > +PHASES +Set on: flag number: 12 PHASES Sets phases + +INPUT PARAMETER > +numphases +VALUE > +100. +Parameter number: 111 NUMPHASES num.of equis.phases = 100.0000 + +INPUT PARAMETER > +norm +VALUE > +1. +Parameter number: 113 NORM Light curve norm. = 1.000000 + +INPUT PARAMETER > +GRID +Set on: flag number: 13 GRID Sets project.grid + +INPUT PARAMETER > +numcells +VALUE > +1000. +Parameter number: 114 NUMCELLS num.of grid points = 1000.000 + +INPUT PARAMETER > +! + +INPUT PARAMETER > +OFF +Set on: flag number: 19 OFF Set next flags off + +INPUT FLAG > +REFLECTION +Set off: flag number: 9 REFLECTION Reflection comput. + +INPUT FLAG > +DISK +Set off: flag number: 3 DISK Disk + +INPUT FLAG > +OFF +Set off: flag number: 19 OFF Set next flags off + +INPUT FLAG > +! + +INPUT FLAG > +! printing: + +INPUT FLAG > +PRINT +Set on: flag number: 20 PRINT Output is printed + +INPUT PARAMETER > +amount +VALUE > +4 +Parameter number: 117 AMOUNT Amount of printing = 4.000000 + +INPUT PARAMETER > +map +VALUE > +0 +Parameter number: 120 MAP Map print phas.step = 0.0000000E+00 + +INPUT PARAMETER > +unit +VALUE > +11 +Parameter number: 119 UNIT Output on this unit = 11.00000 + +INPUT PARAMETER > +refl +VALUE > +0 +Parameter number: 121 REFL Reflection details = 0.0000000E+00 + +INPUT PARAMETER > +light +VALUE > +0 +Parameter number: 122 LIGHT Light curve details = 0.0000000E+00 + +INPUT PARAMETER > +! + +INPUT PARAMETER > +plot +Set on: flag number: 21 PLOT Plot produced + +INPUT PARAMETER > +file +VALUE > +12 +Parameter number: 127 FILE Output ASCII file = 12.00000 + +INPUT PARAMETER > +! + +INPUT PARAMETER > +GO +Set on: flag number: 15 GO Program runs + +Elapsed time for I/O: 2.7891 Total: 2.7891 + + +Computed Lagrange points and potential for critical lobes: + L1= 0.5707528 omega= 2.875845 + L2= 1.582381 omega= 2.577260 + L3=-0.8030282 omega= 2.407752 + + +Surface-X axis intersection for object: 1 computed as: 0.5672197 -0.4678943 +Surface drawing starts from point: 0.5672197 + + +Elapsed time for surface drawing: 15.090 Total: 15.090 + + +Surface-X axis intersection for object: 2 computed as: 0.5742776 1.345321 +Surface drawing starts from point: 1.345321 + + +Elapsed time for surface drawing: 15.402 Total: 30.492 + + +Elapsed time for color band: 0.89844E-01 Total: 0.89844E-01 + + +Elapsed time for color band: 0.14844 Total: 0.23828 + +Sub.luce1: phase: 1 elapsed time for grid initialization: 8.167969 +Sub.luce1: phase: 2 elapsed time for grid initialization: 4.558594 +Sub.luce1: phase: 3 elapsed time for grid initialization: 2.558594 +Sub.luce1: phase: 4 elapsed time for grid initialization: 0.8085938 +Sub.luce1: phase: 5 elapsed time for grid initialization: 0.6210938 +Sub.luce1: phase: 6 elapsed time for grid initialization: 0.4687500 +Sub.luce1: phase: 7 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 8 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 9 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 10 elapsed time for grid initialization: 0.4687500 +Sub.luce1: phase: 11 elapsed time for grid initialization: 0.4179688 +Sub.luce1: phase: 12 elapsed time for grid initialization: 0.4375000 +Sub.luce1: phase: 13 elapsed time for grid initialization: 0.9882813 +Sub.luce1: phase: 14 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 15 elapsed time for grid initialization: 0.4414063 +Sub.luce1: phase: 16 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 17 elapsed time for grid initialization: 0.4335938 +Sub.luce1: phase: 18 elapsed time for grid initialization: 0.4179688 +Sub.luce1: phase: 19 elapsed time for grid initialization: 0.4335938 +Sub.luce1: phase: 20 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 21 elapsed time for grid initialization: 0.4218750 +Sub.luce1: phase: 22 elapsed time for grid initialization: 0.4375000 +Sub.luce1: phase: 23 elapsed time for grid initialization: 0.4414063 +Sub.luce1: phase: 24 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 25 elapsed time for grid initialization: 0.4335938 +Sub.luce1: phase: 26 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 27 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 28 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 29 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 30 elapsed time for grid initialization: 0.4531250 +Sub.luce1: phase: 31 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 32 elapsed time for grid initialization: 0.4179688 +Sub.luce1: phase: 33 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 34 elapsed time for grid initialization: 0.4414063 +Sub.luce1: phase: 35 elapsed time for grid initialization: 0.4335938 +Sub.luce1: phase: 36 elapsed time for grid initialization: 0.4531250 +Sub.luce1: phase: 37 elapsed time for grid initialization: 0.4414063 +Sub.luce1: phase: 38 elapsed time for grid initialization: 0.4414063 +Sub.luce1: phase: 39 elapsed time for grid initialization: 0.4179688 +Sub.luce1: phase: 40 elapsed time for grid initialization: 0.4414063 +Sub.luce1: phase: 41 elapsed time for grid initialization: 0.4218750 +Sub.luce1: phase: 42 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 43 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 44 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 45 elapsed time for grid initialization: 0.4179688 +Sub.luce1: phase: 46 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 47 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 48 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 49 elapsed time for grid initialization: 0.4570313 +Sub.luce1: phase: 50 elapsed time for grid initialization: 0.5390625 +Sub.luce1: phase: 51 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 52 elapsed time for grid initialization: 0.4179688 +Sub.luce1: phase: 53 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 54 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 55 elapsed time for grid initialization: 0.4414063 +Sub.luce1: phase: 56 elapsed time for grid initialization: 0.5117188 +Sub.luce1: phase: 57 elapsed time for grid initialization: 0.5000000 +Sub.luce1: phase: 58 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 59 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 60 elapsed time for grid initialization: 0.4414063 +Sub.luce1: phase: 61 elapsed time for grid initialization: 0.4375000 +Sub.luce1: phase: 62 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 63 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 64 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 65 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 66 elapsed time for grid initialization: 0.4726563 +Sub.luce1: phase: 67 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 68 elapsed time for grid initialization: 0.6406250 +Sub.luce1: phase: 69 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 70 elapsed time for grid initialization: 0.4882813 +Sub.luce1: phase: 71 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 72 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 73 elapsed time for grid initialization: 0.5312500 +Sub.luce1: phase: 74 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 75 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 76 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 77 elapsed time for grid initialization: 0.5390625 +Sub.luce1: phase: 78 elapsed time for grid initialization: 0.4218750 +Sub.luce1: phase: 79 elapsed time for grid initialization: 0.4179688 +Sub.luce1: phase: 80 elapsed time for grid initialization: 0.4179688 +Sub.luce1: phase: 81 elapsed time for grid initialization: 0.4218750 +Sub.luce1: phase: 82 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 83 elapsed time for grid initialization: 0.4179688 +Sub.luce1: phase: 84 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 85 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 86 elapsed time for grid initialization: 0.4687500 +Sub.luce1: phase: 87 elapsed time for grid initialization: 0.4218750 +Sub.luce1: phase: 88 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 89 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 90 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 91 elapsed time for grid initialization: 0.4179688 +Sub.luce1: phase: 92 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 93 elapsed time for grid initialization: 0.4218750 +Sub.luce1: phase: 94 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 95 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 96 elapsed time for grid initialization: 0.5898438 +Sub.luce1: phase: 97 elapsed time for grid initialization: 0.4218750 +Sub.luce1: phase: 98 elapsed time for grid initialization: 0.4296875 +Sub.luce1: phase: 99 elapsed time for grid initialization: 0.4726563 +Sub.luce1: phase: 100 elapsed time for grid initialization: 0.4296875 + +Elapsed time for received ligth : 1036.9 Total: 1036.9 + + + + + ----------------------------- + Ligth Curve Analysis Results + ----------------------------- + + + + + +OPTION SUMMARY: +STARA Star A YES +STARB Star B YES +DISK Disk NO +U U-color band YES +B B-color band NO +V V-color band NO +R R-color band NO +I I-color band NO +REFLECTION Reflection comput. NO +ZEROREFL Zero refl. source NO + + +ORBITAL AND GRID PARAMETERS: +I incl.of orbit plane 70.92000 +MRATIO mass ratio Mb/Ma 0.5000000 +ECC orbit eccentricity 0.0000000E+00 +PREC Newton-Rapson prec. 0.1000000E-04 +NUMPHASES num.of equis.phases 100.0000 +PHASEUNIT unit for input phas 0.0000000E+00 +NORM Light curve norm. 1.000000 +NUMCELLS num.of grid points 1000.000 +R4PREC sin,cos precision 0.1000000E-04 +NULL Unused 0.0000000E+00 + +INPUT PARAMETERS FOR COLOUR BAND: 4 + ULAMB1 U color lambda 1 5300.000 + ULAMB2 U color lambda 2 5300.000 + ULUM_A frac. U lumin.for A 0.0000000E+00 + ULUM_B frac. U lumin.for B 0.0000000E+00 + ULUM_C frac. U lumin.for C 0.0000000E+00 + + +PRINTED OUTPUT PARAMETERS: + AMOUNT Amount of printing 4.000000 + SCREEN Output on screen 1.000000 + UNIT Output on this unit 11.00000 + MAP Map print phas.step 0.0000000E+00 + REFL Reflection details 0.0000000E+00 + LIGHT Light curve details 0.0000000E+00 + + +PLOTTING OUTPUT PARAMETERS: + AMOUNT Amount of printing 10.00000 + SCREEN Output on screen 1.000000 + UNIT Output on this unit 11.00000 + MAP Map plot phase step 1.000000 + FILE Output ASCII file 12.00000 + +INPUT PARAMETERS FOR OBJECT NUMBER: 1 + SHAPEA sphere=1,roche=2 2.000000 + RA radius of star A 0.0000000E+00 + X0A X position of A 0.0000000E+00 + Y0A Y position of A 0.0000000E+00 + Z0A Z position of A 0.0000000E+00 + OMEGAA potential of A 2.876000 + MESHA num. of theta mesh 111.0000 + NPHIA unused 0.0000000E+00 + GA gravity dark. of A 0.3200000 + TEMPA medium temp. of A 5000.000 + BOLA bolometric lum.of A 0.0000000E+00 + ALBA bolometric albedo A 1.000000 + LIMBA limb darkening of A 0.6600000 + CORDA arch,cord,tang.seg. 3.000000 + RIA disk inner radius 0.0000000E+00 + HA disk height at R 0.0000000E+00 + HIA disk height at RI 0.0000000E+00 + INCLINA ang.z-z orbit.plane 0.0000000E+00 + ROTATEA ang.x-x orbit plane 0.0000000E+00 + INNERA unused 0.0000000E+00 + +INPUT PARAMETERS FOR OBJECT NUMBER: 2 + SHAPEB sphere=1,roche=2 2.000000 + RB radius of star B 0.0000000E+00 + X0B X position of B 1.000000 + Y0B Y position of B 0.0000000E+00 + Z0B Z position of B 0.0000000E+00 + OMEGAB potential of B 2.876000 + MESHB num. of theta mesh 111.0000 + NPHIB unused 0.0000000E+00 + GB gravity dark. of B 0.3200000 + TEMPB medium temp. of B 5000.000 + BOLB bolometric lum.of B 0.0000000E+00 + ALBB bolometric albedo B 1.000000 + LIMBB limb darkening of B 0.6600000 + CORDB arch,cord,tang.seg. 3.000000 + RIB disk inner radius 0.0000000E+00 + HB disk height at R 0.0000000E+00 + HIB disk height at RI 0.0000000E+00 + INCLINB ang.z-z orbit.plane 0.0000000E+00 + ROTATEB ang.x-x orbit plane 0.0000000E+00 + INNERB unused 0.0000000E+00 + +ROCHE MODEL DATA: + L1,L2,L3 : lagrange points x position: 0.5707528 1.582381 -0.8030282 + potential for surfaces at L1,L2,L3 : 2.875845 2.577260 2.407752 + XA1,XA2 : intersection star A-x axis: 0.5672197 -0.4678943 + XB1,XB2 : intersection star B-x axis: 0.5742776 1.345321 + approx. y dimension for critical lobe: 0.4371542 0.3117651 + + +Obj. ,pole surf.el.R , X Y Z GX GY GZ T + 1 0.4138879 0.4717969E-01 0.5925476E-02 0.4111474 1.000000 0.0000000E+00 0.0000000E+00 3565.010 + 2 1.010642 0.9658665 0.4286953E-02 0.2974563 0.8713560 0.4906513 0.0000000E+00 3960.520 + +RUN PARAMETERS: + + Fine grid surface elements : 30708 Max allowed : 200000 + For object 1: 15354 + For object 2: 15354 + For object 3: 0 + + Coarse grid surface elements: 30708 Max allowed : 50000 Coarsing factor: 1 + For object 1: 15354 + For object 2: 15354 + For object 3: 0 + Reflection paths: 0 Max allowed : 250000 Iterations done: 0 + + + + BOLOMETRIC LUMINOSITY FOR EACH OBJECT : + object number, total surf.area, emitted lumin.,reflected lum., total lum., input lum. value, lum.norm.factor + 1 2.368121 0.2485914E+11 0.0000000E+00 0.2485914E+11 0.0000000E+00 0.0000000E+00 + 2 1.262773 0.1315058E+11 0.0000000E+00 0.1315058E+11 0.0000000E+00 0.0000000E+00 + + +Objectc, U-band lum., B-band lum., V-band lum., R-band lum., I-band lum. + 1 11067.96 .0000000E+00 .0000000E+00 .0000000E+00 .0000000E+00 + 2 11067.96 .0000000E+00 .0000000E+00 .0000000E+00 .0000000E+00 + 3 .0000000E+00 .0000000E+00 .0000000E+00 .0000000E+00 .0000000E+00 + + + +LIGHT CURVE PRODUCED: (grid used:1000 *1000 ; step: 0.29347E-02 from: -1.4674 to: 1.4674 ) + Phase bol.lum. from star A from star B from disk + 1 0.00000E+00 0.00000E+00 0.706791 0.406590 0.300201 0.000000E+00 + 2 0.62832E-01 0.10000E-01 0.710643 0.410308 0.300335 0.000000E+00 + 3 0.12566 0.20000E-01 0.720942 0.420204 0.300737 0.000000E+00 + 4 0.18850 0.30000E-01 0.737377 0.435973 0.301405 0.000000E+00 + 5 0.25133 0.40000E-01 0.756291 0.453956 0.302335 0.000000E+00 + 6 0.31416 0.50000E-01 0.777438 0.473916 0.303522 0.000000E+00 + 7 0.37699 0.60000E-01 0.799318 0.494356 0.304962 0.000000E+00 + 8 0.43982 0.70000E-01 0.821588 0.514940 0.306648 0.000000E+00 + 9 0.50265 0.80000E-01 0.843484 0.534911 0.308573 0.000000E+00 + 10 0.56549 0.90000E-01 0.864418 0.553693 0.310725 0.000000E+00 + 11 0.62832 0.10000 0.882917 0.569818 0.313099 0.000000E+00 + 12 0.69115 0.11000 0.899240 0.583557 0.315684 0.000000E+00 + 13 0.75398 0.12000 0.913368 0.594903 0.318465 0.000000E+00 + 14 0.81681 0.13000 0.925860 0.604428 0.321432 0.000000E+00 + 15 0.87965 0.14000 0.936893 0.612327 0.324566 0.000000E+00 + 16 0.94248 0.15000 0.946804 0.618960 0.327845 0.000000E+00 + 17 1.0053 0.16000 0.956139 0.624916 0.331223 0.000000E+00 + 18 1.0681 0.17000 0.965069 0.630453 0.334616 0.000000E+00 + 19 1.1310 0.18000 0.973278 0.635342 0.337936 0.000000E+00 + 20 1.1938 0.19000 0.980596 0.639496 0.341101 0.000000E+00 + 21 1.2566 0.20000 0.986869 0.642825 0.344044 0.000000E+00 + 22 1.3195 0.21000 0.992002 0.645305 0.346696 0.000000E+00 + 23 1.3823 0.22000 0.995916 0.646923 0.348994 0.000000E+00 + 24 1.4451 0.23000 0.998558 0.647683 0.350875 0.000000E+00 + 25 1.5080 0.24000 0.999920 0.647630 0.352290 0.000000E+00 + 26 1.5708 0.25000 1.00000 0.646801 0.353199 0.000000E+00 + 27 1.6336 0.26000 0.998801 0.645247 0.353554 0.000000E+00 + 28 1.6965 0.27000 0.996381 0.643050 0.353331 0.000000E+00 + 29 1.7593 0.28000 0.992799 0.640285 0.352514 0.000000E+00 + 30 1.8221 0.29000 0.988132 0.637047 0.351085 0.000000E+00 + 31 1.8850 0.30000 0.982474 0.633423 0.349051 0.000000E+00 + 32 1.9478 0.31000 0.975938 0.629518 0.346420 0.000000E+00 + 33 2.0106 0.32000 0.968659 0.625445 0.343214 0.000000E+00 + 34 2.0735 0.33000 0.960810 0.621315 0.339495 0.000000E+00 + 35 2.1363 0.34000 0.952557 0.617252 0.335305 0.000000E+00 + 36 2.1991 0.35000 0.944181 0.613424 0.330757 0.000000E+00 + 37 2.2619 0.36000 0.935523 0.609888 0.325635 0.000000E+00 + 38 2.3248 0.37000 0.925887 0.606628 0.319259 0.000000E+00 + 39 2.3876 0.38000 0.914734 0.603643 0.311091 0.000000E+00 + 40 2.4504 0.39000 0.901574 0.600916 0.300658 0.000000E+00 + 41 2.5133 0.40000 0.886028 0.598442 0.287585 0.000000E+00 + 42 2.5761 0.41000 0.868229 0.596218 0.272011 0.000000E+00 + 43 2.6389 0.42000 0.848059 0.594235 0.253825 0.000000E+00 + 44 2.7018 0.43000 0.825613 0.592494 0.233118 0.000000E+00 + 45 2.7646 0.44000 0.802054 0.590987 0.211066 0.000000E+00 + 46 2.8274 0.45000 0.778506 0.589720 0.188786 0.000000E+00 + 47 2.8903 0.46000 0.756779 0.588681 0.168098 0.000000E+00 + 48 2.9531 0.47000 0.738736 0.587875 0.150861 0.000000E+00 + 49 3.0159 0.48000 0.723859 0.587300 0.136559 0.000000E+00 + 50 3.0788 0.49000 0.713884 0.586956 0.126927 0.000000E+00 + 51 3.1416 0.50000 0.710648 0.586842 0.123806 0.000000E+00 + 52 3.2044 0.51000 0.713989 0.586956 0.127033 0.000000E+00 + 53 3.2673 0.52000 0.723726 0.587301 0.136425 0.000000E+00 + 54 3.3301 0.53000 0.738300 0.587875 0.150425 0.000000E+00 + 55 3.3929 0.54000 0.756560 0.588681 0.167879 0.000000E+00 + 56 3.4558 0.55000 0.778144 0.589720 0.188424 0.000000E+00 + 57 3.5186 0.56000 0.801613 0.590988 0.210626 0.000000E+00 + 58 3.5814 0.57000 0.825342 0.592494 0.232847 0.000000E+00 + 59 3.6442 0.58000 0.847714 0.594235 0.253479 0.000000E+00 + 60 3.7071 0.59000 0.868067 0.596217 0.271850 0.000000E+00 + 61 3.7699 0.60000 0.886007 0.598442 0.287565 0.000000E+00 + 62 3.8327 0.61000 0.901494 0.600915 0.300580 0.000000E+00 + 63 3.8956 0.62000 0.914719 0.603643 0.311076 0.000000E+00 + 64 3.9584 0.63000 0.925848 0.606630 0.319219 0.000000E+00 + 65 4.0212 0.64000 0.935526 0.609888 0.325638 0.000000E+00 + 66 4.0841 0.65000 0.944184 0.613421 0.330763 0.000000E+00 + 67 4.1469 0.66000 0.952552 0.617254 0.335297 0.000000E+00 + 68 4.2097 0.67000 0.960803 0.621313 0.339490 0.000000E+00 + 69 4.2726 0.68000 0.968666 0.625445 0.343222 0.000000E+00 + 70 4.3354 0.69000 0.975934 0.629519 0.346415 0.000000E+00 + 71 4.3982 0.70000 0.982472 0.633422 0.349050 0.000000E+00 + 72 4.4611 0.71000 0.988132 0.637045 0.351087 0.000000E+00 + 73 4.5239 0.72000 0.992800 0.640286 0.352514 0.000000E+00 + 74 4.5867 0.73000 0.996378 0.643045 0.353333 0.000000E+00 + 75 4.6496 0.74000 0.998799 0.645247 0.353552 0.000000E+00 + 76 4.7124 0.75000 1.00000 0.646801 0.353199 0.000000E+00 + 77 4.7752 0.76000 0.999917 0.647627 0.352290 0.000000E+00 + 78 4.8381 0.77000 0.998558 0.647687 0.350871 0.000000E+00 + 79 4.9009 0.78000 0.995915 0.646922 0.348993 0.000000E+00 + 80 4.9637 0.79000 0.992002 0.645308 0.346694 0.000000E+00 + 81 5.0265 0.80000 0.986870 0.642826 0.344044 0.000000E+00 + 82 5.0894 0.81000 0.980588 0.639487 0.341102 0.000000E+00 + 83 5.1522 0.82000 0.973270 0.635336 0.337934 0.000000E+00 + 84 5.2150 0.83000 0.965064 0.630448 0.334616 0.000000E+00 + 85 5.2779 0.84000 0.956135 0.624911 0.331224 0.000000E+00 + 86 5.3407 0.85000 0.946790 0.618946 0.327844 0.000000E+00 + 87 5.4035 0.86000 0.936893 0.612328 0.324565 0.000000E+00 + 88 5.4664 0.87000 0.925735 0.604304 0.321432 0.000000E+00 + 89 5.5292 0.88000 0.913237 0.594772 0.318465 0.000000E+00 + 90 5.5920 0.89000 0.898948 0.583264 0.315684 0.000000E+00 + 91 5.6549 0.90000 0.882531 0.569432 0.313099 0.000000E+00 + 92 5.7177 0.91000 0.863851 0.553125 0.310725 0.000000E+00 + 93 5.7805 0.92000 0.842906 0.534335 0.308571 0.000000E+00 + 94 5.8434 0.93000 0.820920 0.514272 0.306648 0.000000E+00 + 95 5.9062 0.94000 0.798523 0.493561 0.304962 0.000000E+00 + 96 5.9690 0.95000 0.776806 0.473283 0.303522 0.000000E+00 + 97 6.0319 0.96000 0.755854 0.453519 0.302335 0.000000E+00 + 98 6.0947 0.97000 0.736788 0.435384 0.301404 0.000000E+00 + 99 6.1575 0.98000 0.720845 0.420108 0.300737 0.000000E+00 +100 6.2204 0.99000 0.710454 0.410118 0.300335 0.000000E+00 + 1 0.4138879 0.4717969E-01 0.5925476E-02 0.4111474 1.000000 0.0000000E+00 0.0000000E+00 3565.010 + 2 1.010642 0.9658665 0.4286953E-02 0.2974563 0.8713560 0.4906513 0.0000000E+00 3960.520 + +Elapsed time for I/O: 4.2773 Total: 7.0664 + + +Light curve written on unit:12 Num.phases: 100 Num. of colors: 5 + +Elapsed time for plot: 1.4023 Total: 1.4023 + + +INPUT FLAG > +STOP +Set on: flag number: 16 STOP Program stops + + + +Total elapsed time for I/O: 7.0664 +Total elapsed time for plotting: 1.4023 +Total elapsed time for surface drawing: 30.492 +Total elapsed time for reflection : 0.00000E+00 +Total elapsed time for colour band flux: 0.23828 +Total elapsed time for light to observer: 1036.9 +Total elapsed time for this run: 1076.1 + + + +FORTRAN STOP +$EXIT + MARC job terminated at 5-MAR-1992 12:23:16.31 + + Accounting information: + Buffered I/O count: 94 Peak working set size: 14982 + Direct I/O count: 203 Peak page file size: 93977 + Page faults: 30200 Mounted volumes: 0 + Charged CPU time: 0 00:16:46.30 Elapsed time: 0 00:18:10.30 diff --git a/codemeta.json b/codemeta.json new file mode 100644 index 0000000..6b3e28b --- /dev/null +++ b/codemeta.json @@ -0,0 +1,36 @@ +{ + "@context": "https://doi.org/10.5063/schema/codemeta-2.0", + "@type": "SoftwareSourceCode", + "name": "cbs", + "description": "A VAX/VMS FORTRAN program for close binary system light curve simulation." + "codeRepository": "http://legacy.helldragon.eu/gitweb/cbs.git", + "downloadUrl": "git://legacy.helldragon.eu/cbs.git", + "programmingLanguage": "VAX FORTRAN", + "operatingSystem": "VAX-VMS" + "license": "Public domain", + "dateCreated":"1993-12-01", + "datePublished":"2019-12-26", + "developmentStatus": "Unsupported", + "creativeWorkStatus": "Legacy software" + "keywords": [ + "cbs", + "close binary sistem", + "photometry", + "roche lobes", + ], + "author": [ + { + "@type": "Person", + "givenName": "Marcello", + "familyName": "Galli", + "email": "marcello.galli@tiscali.it", + "web":"http://www.helldragon.eu", + "@id": "https://orcid.org/0000-0002-9135-3228" + }, + { + "@type": "Person", + "givenName": "Loretta", + "familyName": "Solmi" + } + ] +} -- 2.39.5