00001 
00002 
00003 
00004 
00005 
00006 
00007 #include "cddefines.h"
00008 #include "physconst.h"
00009 #include "dense.h"
00010 #include "doppvel.h"
00011 #include "optimize.h"
00012 #include "input.h"
00013 #include "wind.h"
00014 #include "magnetic.h"
00015 
00016 
00017 static double Btangl_init;
00018 
00019 
00020 
00021 static bool lgBinitialized;
00022 
00023 
00024 static double Btangl_here;
00025 
00026 
00027 static double Bpar_init, Btan_init;
00028 
00029 
00030 static double Bpar_here, Btan_here;
00031 
00032 
00033 static double gamma_mag;
00034 
00035 
00036 void Magnetic_evaluate(void)
00037 {
00038 
00039         DEBUG_ENTRY( "Magnetic_evaluate()" );
00040 
00041         
00042         if( magnetic.lgB )
00043         {
00044                 static double density_initial, 
00045                         
00046                         v_A;
00047 
00048                 
00049 
00050                 if( !lgBinitialized )
00051                 {
00052                         lgBinitialized = true;
00053 
00054                         
00055                         Btangl_here = Btangl_init;
00056 
00057                         
00058                         
00059                         Bpar_here = Bpar_init;
00060                         Btan_here = Btan_init;
00061 
00062                         
00063                         density_initial = dense.xMassDensity;
00064 
00065                         
00066                         v_A = POW2(Bpar_init) / (PI4 * density_initial );
00067                 }
00068 
00069                 
00070                 
00071                 Btangl_here = Btangl_init * pow(dense.xMassDensity/density_initial, gamma_mag/2.);
00072 
00073                 
00074 
00075                 if( wind.windv0 != 0. )
00076                 {
00077                         
00078                         
00079                         Btan_here = Btan_init * (POW2(wind.windv0) - v_A)/ (wind.windv*wind.windv0-v_A);
00080                 }
00081 
00082                 
00083 
00084                 magnetic.pressure = POW2(Btangl_here)/PI8 + (POW2(Btan_here) - POW2(Bpar_here)) / PI8;
00085 
00086                 
00087                 magnetic.energydensity = POW2(Btangl_here)/PI8 + (POW2(Btan_here) + POW2(Bpar_here)) / PI8;
00088 
00089                 
00090                 if( DoppVel.lgTurbEquiMag )
00091                 {
00092                         
00093 
00094 
00095                         
00096                         
00097                         
00098                         DoppVel.TurbVel = (realnum)sqrt(6.*magnetic.energydensity/dense.xMassDensity/
00099                                 DoppVel.Heiles_Troland_F);
00100                         
00101                         
00102 
00103 
00104                 }
00105 
00106                 
00107                 magnetic.EnthalpyDensity = gamma_mag/(gamma_mag-1.) *
00108                         POW2(Btangl_here)/PI8 + (POW2(Btan_here) + POW2(Bpar_here)) / PI4;
00109         }
00110         else
00111         {
00112                 magnetic.pressure = 0.;
00113                 magnetic.energydensity = 0.;
00114                 magnetic.EnthalpyDensity = 0.;
00115         }
00116         return;
00117 }
00118 
00119 
00120 void Magnetic_reinit(void)
00121 {
00122         DEBUG_ENTRY( "Magnetic_reinit()" );
00123 
00124         
00125         lgBinitialized = false;
00126         return;
00127 }
00128 
00129 
00130 void Magnetic_init(void)
00131 {
00132 
00133         DEBUG_ENTRY( "Magnetic_init()" );
00134 
00135         gamma_mag = 4./3.;
00136         magnetic.lgB = false;
00137         
00138         lgBinitialized = false;
00139         
00140         Btangl_init = 0.;
00141         Btangl_here = DBL_MAX;
00142         magnetic.pressure = DBL_MAX;
00143         magnetic.energydensity = DBL_MAX;
00144         Bpar_init = 0.;
00145         Btan_init = 0.;
00146         Bpar_here = DBL_MAX;
00147         Btan_here = DBL_MAX;
00148         magnetic.EnthalpyDensity = DBL_MAX;
00149         return;
00150 }
00151 
00152 
00153 void ParseMagnet(char *chCard )
00154 {
00155         bool lgEOL;
00156         long int i;
00157         bool lgTangled;
00158         double angle_wrt_los=-1. , Border_init=-1.;
00159 
00160         DEBUG_ENTRY( "ParseMagnet()" );
00161 
00162         
00163         magnetic.lgB = true;
00164 
00165         
00166         if( nMatch("ORDE" , chCard ) )
00167         {
00168                 
00169                 lgTangled = false;
00170 
00171                 
00172 
00173 
00174                 i = 5;
00175                 
00176                 Border_init = FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00177                 Border_init = pow(10.,Border_init );
00178 
00179                 
00180                 angle_wrt_los = FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00181                 if( lgEOL )
00182                         NoNumb(chCard);
00183 
00184                 
00185 
00186                 if( !nMatch("RADI" , chCard ) )
00187                         angle_wrt_los *= PI2 / 360.;
00188 
00189                 
00190                 Bpar_init = Border_init*cos(angle_wrt_los);
00191                 Btan_init = Border_init*sin(angle_wrt_los);
00192 
00193         }
00194         else
00195         {
00196                 
00197                 lgTangled = true;
00198                 i = 5;
00199                 
00200                 Btangl_init = FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00201                 if( lgEOL )
00202                         NoNumb(chCard);
00203                 Btangl_init = pow(10.,Btangl_init );
00204 
00205                 
00206                 gamma_mag = FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00207                 if( lgEOL )
00208                         gamma_mag = 4./3.;
00209 
00210                 if( gamma_mag !=0. && gamma_mag <=1. )
00211                 {
00212                         
00213                         fprintf( ioQQQ, 
00214                                 " This value of gamma (%.3e) is impossible.  Must have gamma = 0 or > 1.\n Sorry.\n",
00215                                 gamma_mag );
00216                         cdEXIT(EXIT_FAILURE);
00217                 }
00218         }
00219 
00220         
00221         if( optimize.lgVarOn )
00222         {
00223                 
00224                 optimize.nvarxt[optimize.nparm] = 2;
00225                 if( lgTangled )
00226                 {
00227                         
00228                         strcpy( optimize.chVarFmt[optimize.nparm], "MAGNETIC FIELD TANGLED =%f GAMMA= %f" );
00229                         optimize.vparm[0][optimize.nparm] = (realnum)log10( Btangl_init );
00230                         
00231                         optimize.vparm[1][optimize.nparm] = (realnum)gamma_mag;
00232                 }
00233                 else
00234                 {
00235                         
00236                         strcpy( optimize.chVarFmt[optimize.nparm], "MAGNETIC FIELD ORDERED =%f ANGLE RADIANS = %f" );
00237                         optimize.vparm[0][optimize.nparm] = (realnum)log10( Border_init );
00238                         
00239                         optimize.vparm[1][optimize.nparm] = (realnum)angle_wrt_los;
00240                 }
00241 
00242                 
00243                 optimize.nvfpnt[optimize.nparm] = input.nRead;
00244                 optimize.vincr[optimize.nparm] = 0.5;
00245                 ++optimize.nparm;
00246         }
00247         return;
00248 }