cloudy trunk
Loading...
Searching...
No Matches
parse_illuminate.cpp
Go to the documentation of this file.
1/* This file is part of Cloudy and is copyright (C)1978-2013 by Gary J. Ferland and
2 * others. For conditions of distribution and use see copyright notice in license.txt */
3/*ParseStop parse the stop command */
4#include "cddefines.h"
5#include "physconst.h"
6#include "optimize.h"
7#include "phycon.h"
8#include "rfield.h"
9#include "radius.h"
10#include "geometry.h"
11#include "iterations.h"
12#include "stopcalc.h"
13#include "input.h"
14#include "parser.h"
15
17{
18 DEBUG_ENTRY( "ParseIlluminate()" );
19
20 if( rfield.nShape < 1 )
21 {
22 fprintf(ioQQQ,"PROBLEM the illuminate command has come before any "
23 "radiation field shape commands.\nThis must come after the field"
24 " is specified.\nSorry.\n");
26 }
27
28 rfield.Illumination[rfield.nShape-1] = Illuminate::FORWARD;// default
29 // use chCard()+4 to make sure the command ILLUMINATE itself is not picked up
30 if( p.nMatch( "FORW" ) )
31 rfield.Illumination[rfield.nShape-1] = Illuminate::FORWARD;
32 else if( p.nMatch( "REVE" ) )
33 rfield.Illumination[rfield.nShape-1] = Illuminate::REVERSE;
34 else if( p.nMatch( "SYMM" ) )
35 rfield.Illumination[rfield.nShape-1] = Illuminate::SYMMETRIC;
36
37 // isotropic case
38 if( p.nMatch( "ISOT" ) )
39 {
40 // isotropic illumination - following not meaningful
41 rfield.OpticalDepthScaleFactor[rfield.nShape-1] = 1.;
42 rfield.lgBeamed[rfield.nShape-1] = false;
43 }
44 else
45 {
46 double AngleIllumRadian = 0.;
47
48 /* default is to specify an illumination angle */
49 rfield.lgBeamed[rfield.nShape-1] = true;
50 double a = p.FFmtRead();
51 if( p.lgEOL() )
52 p.NoNumb("illumination angle");
53
54 /* default is degrees, but radian key accepted */
55 if( p.nMatch( "RADI" ) )
56 AngleIllumRadian = a;
57 else
58 AngleIllumRadian = a/RADIAN;
59 if( AngleIllumRadian < 0. || AngleIllumRadian >= PI/2. )
60 {
61 fprintf( ioQQQ, " Angle of illumination must be between 0 and 90 degrees "
62 "or 0 and pi/2 radians.\n" );
64 }
65
66 /* this is effective path 1. / COS( theta ) - so that
67 * dTau_eff = dTau_normal * geometry.DirectionalCosin */
68 geometry.DirectionalCosin = (realnum)(1./cos(AngleIllumRadian));
69
70 rfield.OpticalDepthScaleFactor[rfield.nShape-1] =
71 (realnum)(1./cos(AngleIllumRadian));
72
73 /* vary option */
74 if( optimize.lgVarOn )
75 {
76 /* no luminosity options on vary */
77 optimize.nvarxt[optimize.nparm] = 1;
78 if( p.nMatch( "RADI" ) )
79 {
80 strcpy( optimize.chVarFmt[optimize.nparm], "ILLUMINATE %f RADIAN" );
81 optimize.vparm[0][optimize.nparm] = (realnum)AngleIllumRadian;
82 optimize.varang[optimize.nparm][0] = 0.f;
83 optimize.varang[optimize.nparm][1] = realnum(PI/2.);
84 }
85 else
86 {
87 strcpy( optimize.chVarFmt[optimize.nparm], "ILLUMINATE %f" );
88 optimize.vparm[0][optimize.nparm] = (realnum)(AngleIllumRadian*RADIAN);
89 optimize.varang[optimize.nparm][0] = 0.f;
90 optimize.varang[optimize.nparm][1] = 90.f;
91 }
92
93 if( rfield.Illumination[rfield.nShape-1] == Illuminate::FORWARD )
94 strcat( optimize.chVarFmt[optimize.nparm], " FORWARD" );
95 else if( rfield.Illumination[rfield.nShape-1] == Illuminate::REVERSE )
96 strcat( optimize.chVarFmt[optimize.nparm], " REVERSE" );
97 else if( rfield.Illumination[rfield.nShape-1] == Illuminate::SYMMETRIC )
98 strcat( optimize.chVarFmt[optimize.nparm], " SYMMETRIC" );
99
100 optimize.lgOptimizeAsLinear[optimize.nparm] = true;
101 /* pointer to where to write */
102 optimize.nvfpnt[optimize.nparm] = input.nRead;
103 /* the increment in the first steps away from the original value */
104 optimize.vincr[optimize.nparm] = 0.1f;
105 optimize.nparm += 1;
106 }
107 }
108}
109
FILE * ioQQQ
Definition cddefines.cpp:7
#define EXIT_FAILURE
Definition cddefines.h:140
#define cdEXIT(FAIL)
Definition cddefines.h:434
float realnum
Definition cddefines.h:103
#define DEBUG_ENTRY(funcname)
Definition cddefines.h:684
double FFmtRead(void)
Definition parser.cpp:353
bool nMatch(const char *chKey) const
Definition parser.h:135
bool lgEOL(void) const
Definition parser.h:98
NORETURN void NoNumb(const char *chDesc) const
Definition parser.cpp:233
t_geometry geometry
Definition geometry.cpp:5
t_input input
Definition input.cpp:12
@ SYMMETRIC
Definition rfield.h:30
@ FORWARD
Definition rfield.h:30
@ REVERSE
Definition rfield.h:30
t_optimize optimize
Definition optimize.cpp:5
void ParseIlluminate(Parser &p)
UNUSED const double PI
Definition physconst.h:29
UNUSED const double RADIAN
Definition physconst.h:63
t_rfield rfield
Definition rfield.cpp:8