00001 /* This file is part of Cloudy and is copyright (C)1978-2013 by Gary J. Ferland and 00002 * others. For conditions of distribution and use see copyright notice in license.txt */ 00003 /*ParseStop parse the stop command */ 00004 #include "cddefines.h" 00005 #include "physconst.h" 00006 #include "optimize.h" 00007 #include "phycon.h" 00008 #include "rfield.h" 00009 #include "radius.h" 00010 #include "geometry.h" 00011 #include "iterations.h" 00012 #include "stopcalc.h" 00013 #include "input.h" 00014 #include "parser.h" 00015 00016 void ParseIlluminate(Parser &p) 00017 { 00018 DEBUG_ENTRY( "ParseIlluminate()" ); 00019 00020 if( rfield.nShape < 1 ) 00021 { 00022 fprintf(ioQQQ,"PROBLEM the illuminate command has come before any " 00023 "radiation field shape commands.\nThis must come after the field" 00024 " is specified.\nSorry.\n"); 00025 cdEXIT(EXIT_FAILURE); 00026 } 00027 00028 rfield.Illumination[rfield.nShape-1] = Illuminate::FORWARD;// default 00029 // use chCard()+4 to make sure the command ILLUMINATE itself is not picked up 00030 if( p.nMatch( "FORW" ) ) 00031 rfield.Illumination[rfield.nShape-1] = Illuminate::FORWARD; 00032 else if( p.nMatch( "REVE" ) ) 00033 rfield.Illumination[rfield.nShape-1] = Illuminate::REVERSE; 00034 else if( p.nMatch( "SYMM" ) ) 00035 rfield.Illumination[rfield.nShape-1] = Illuminate::SYMMETRIC; 00036 00037 // isotropic case 00038 if( p.nMatch( "ISOT" ) ) 00039 { 00040 // isotropic illumination - following not meaningful 00041 rfield.OpticalDepthScaleFactor[rfield.nShape-1] = 1.; 00042 rfield.lgBeamed[rfield.nShape-1] = false; 00043 } 00044 else 00045 { 00046 double AngleIllumRadian = 0.; 00047 00048 /* default is to specify an illumination angle */ 00049 rfield.lgBeamed[rfield.nShape-1] = true; 00050 double a = p.FFmtRead(); 00051 if( p.lgEOL() ) 00052 p.NoNumb("illumination angle"); 00053 00054 /* default is degrees, but radian key accepted */ 00055 if( p.nMatch( "RADI" ) ) 00056 AngleIllumRadian = a; 00057 else 00058 AngleIllumRadian = a/RADIAN; 00059 if( AngleIllumRadian < 0. || AngleIllumRadian >= PI/2. ) 00060 { 00061 fprintf( ioQQQ, " Angle of illumination must be between 0 and 90 degrees " 00062 "or 0 and pi/2 radians.\n" ); 00063 cdEXIT(EXIT_FAILURE); 00064 } 00065 00066 /* this is effective path 1. / COS( theta ) - so that 00067 * dTau_eff = dTau_normal * geometry.DirectionalCosin */ 00068 geometry.DirectionalCosin = (realnum)(1./cos(AngleIllumRadian)); 00069 00070 rfield.OpticalDepthScaleFactor[rfield.nShape-1] = 00071 (realnum)(1./cos(AngleIllumRadian)); 00072 00073 /* vary option */ 00074 if( optimize.lgVarOn ) 00075 { 00076 /* no luminosity options on vary */ 00077 optimize.nvarxt[optimize.nparm] = 1; 00078 if( p.nMatch( "RADI" ) ) 00079 { 00080 strcpy( optimize.chVarFmt[optimize.nparm], "ILLUMINATE %f RADIAN" ); 00081 optimize.vparm[0][optimize.nparm] = (realnum)AngleIllumRadian; 00082 optimize.varang[optimize.nparm][0] = 0.f; 00083 optimize.varang[optimize.nparm][1] = realnum(PI/2.); 00084 } 00085 else 00086 { 00087 strcpy( optimize.chVarFmt[optimize.nparm], "ILLUMINATE %f" ); 00088 optimize.vparm[0][optimize.nparm] = (realnum)(AngleIllumRadian*RADIAN); 00089 optimize.varang[optimize.nparm][0] = 0.f; 00090 optimize.varang[optimize.nparm][1] = 90.f; 00091 } 00092 00093 if( rfield.Illumination[rfield.nShape-1] == Illuminate::FORWARD ) 00094 strcat( optimize.chVarFmt[optimize.nparm], " FORWARD" ); 00095 else if( rfield.Illumination[rfield.nShape-1] == Illuminate::REVERSE ) 00096 strcat( optimize.chVarFmt[optimize.nparm], " REVERSE" ); 00097 else if( rfield.Illumination[rfield.nShape-1] == Illuminate::SYMMETRIC ) 00098 strcat( optimize.chVarFmt[optimize.nparm], " SYMMETRIC" ); 00099 00100 optimize.lgOptimizeAsLinear[optimize.nparm] = true; 00101 /* pointer to where to write */ 00102 optimize.nvfpnt[optimize.nparm] = input.nRead; 00103 /* the increment in the first steps away from the original value */ 00104 optimize.vincr[optimize.nparm] = 0.1f; 00105 optimize.nparm += 1; 00106 } 00107 } 00108 } 00109