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 }