source: issm/trunk-jpl/src/m/classes/autodiff.js@ 21065

Last change on this file since 21065 was 21065, checked in by agscott1, 9 years ago

CHG: Replaced all javascript enums with solution strings and analyses strings to match matlab and python code

File size: 8.7 KB
Line 
1//AUTODIFF class definition
2//
3// Usage:
4// autodiff=new autodiff();
5
6function autodiff (){
7 //methods
8 this.setdefaultparameters = function(){// {{{
9
10 this.obufsize = 524288;
11 this.lbufsize = 524288;
12 this.cbufsize = 524288;
13 this.tbufsize = 524288;
14 this.gcTriggerRatio=2.0;
15 this.gcTriggerMaxSize=65536;
16
17 }// }}}
18 this.disp= function(){// {{{
19
20 console.log(sprintf(' automatic differentiation parameters:'));
21 fielddisplay(this,'isautodiff','indicates if the automatic differentiation is activated');
22 fielddisplay(this,'dependents','list of dependent variables');
23 fielddisplay(this,'independents','list of independent variables');
24 fielddisplay(this,'driver',"ADOLC driver ('fos_forward' or 'fov_forward')");
25 fielddisplay(this,'obufsize','Number of operations per buffer (==OBUFSIZE in usrparms.h)');
26 fielddisplay(this,'lbufsize','Number of locations per buffer (==LBUFSIZE in usrparms.h)');
27 fielddisplay(this,'cbufsize','Number of values per buffer (==CBUFSIZE in usrparms.h)');
28 fielddisplay(this,'tbufsize','Number of taylors per buffer (<=TBUFSIZE in usrparms.h)');
29 fielddisplay(this,'gcTriggerRatio','free location block sorting/consolidation triggered if the ratio between allocated and used locations exceeds gcTriggerRatio');
30 fielddisplay(this,'gcTriggerMaxSize','free location block sorting/consolidation triggered if the allocated locations exceed gcTriggerMaxSize');
31
32 }// }}}
33 this.classname= function(){// {{{
34 return "autodiff";
35 }// }}}
36 this.checkconsistency = function(md,solution,analyses){ //{{{
37
38 //Early return
39 if (!this.isautodiff) return;
40
41 //Driver value:
42 checkfield(md,'fieldname','autodiff.driver','values',['fos_forward','fov_forward','fov_forward_all','fos_reverse','fov_reverse','fov_reverse_all']);
43
44 //buffer values:
45 checkfield(md,'fieldname','autodiff.obufsize','>=',16);
46 checkfield(md,'fieldname','autodiff.lbufsize','>=',16);
47 checkfield(md,'fieldname','autodiff.cbufsize','>=',16);
48 checkfield(md,'fieldname','autodiff.tbufsize','>=',16);
49 checkfield(md,'fieldname','autodiff.gcTriggerRatio','>=',0);
50 checkfield(md,'fieldname','autodiff.gcTriggerMaxSize','>=',65536);
51
52 //go through our dependents and independents and check consistency:
53 for (var i=0;i<this.dependents.length;i++){
54 dep=this.dependents[i];
55 dep.checkconsistency(md,solution,analyses);
56 }
57 for (var i=0;i<this.independents.length;i++){
58 indep=this.independents[i];
59 indep.checkconsistency(md,i,solution,analyses,this.driver);
60 }
61 } // }}}
62 this.marshall=function(md,prefix,fid) { //{{{
63
64 WriteData(fid,prefix,'object',this,'fieldname','isautodiff','format','Boolean');
65 WriteData(fid,prefix,'object',this,'fieldname','driver','format','String');
66
67 //early return
68 if (!this.isautodiff){
69 WriteData(fid,prefix,'data',false,'name','md.autodiff.mass_flux_segments_present','format','Boolean');
70 WriteData(fid,prefix,'data',false,'name','md.autodiff.keep','format','Boolean');
71 return;
72 }
73
74 //buffer sizes {{{
75 WriteData(fid,prefix,'object',this,'fieldname','obufsize','format','Double');
76 WriteData(fid,prefix,'object',this,'fieldname','lbufsize','format','Double');
77 WriteData(fid,prefix,'object',this,'fieldname','cbufsize','format','Double');
78 WriteData(fid,prefix,'object',this,'fieldname','tbufsize','format','Double');
79 WriteData(fid,prefix,'object',this,'fieldname','gcTriggerRatio','format','Double');
80 WriteData(fid,prefix,'object',this,'fieldname','gcTriggerMaxSize','format','Double');
81 //}}}
82 //process dependent variables {{{
83 num_dependent_objects=this.dependents.length;
84 WriteData(fid,prefix,'data',num_dependent_objects,'name','md.autodiff.num_dependent_objects','format','Integer');
85
86 if(num_dependent_objects){
87 var names=[];
88 types=NewArrayFill(num_dependent_objects,0);
89 indices=NewArrayFill(num_dependent_objects,0);
90
91 for (var i=0;i<num_dependent_objects;i++){
92 dep=this.dependents[i];
93
94 names.push(dep.name);
95 types[i]=dep.typetoscalar();
96 indices[i]=dep.index;
97 }
98 WriteData(fid,prefix,'data',names,'name','md.autodiff.dependent_object_names','format','StringArray');
99 WriteData(fid,prefix,'data',types,'name','md.autodiff.dependent_object_types','format','IntMat','mattype',3);
100 WriteData(fid,prefix,'data',indices,'name','md.autodiff.dependent_object_indices','format','IntMat','mattype',3);
101 }
102 //}}}
103 //process independent variables {{{
104 num_independent_objects=this.independents.length;
105 WriteData(fid,prefix,'data',num_independent_objects,'name','md.autodiff.num_independent_objects','format','Integer');
106
107 if(num_independent_objects){
108 names=NewArrayFill(num_independent_objects,0);
109 types=NewArrayFill(num_independent_objects,0);
110
111 for (var i=0;i<num_independent_objects;i++){
112 indep=this.independents[i];
113
114 names[i]=indep.name;
115 types[i]=indep.typetoscalar();
116 }
117 WriteData(fid,prefix,'data',names,'name','md.autodiff.independent_object_names','format','StringArray');
118 WriteData(fid,prefix,'data',types,'name','md.autodiff.independent_object_types','format','IntMat','mattype',3);
119 }
120 //}}}
121 //if driver is fos_forward, build index: {{{
122 if (this.driver == 'fos_forward'){
123 var index=0;
124
125 for (var i=0;i<num_independent_objects;i++){
126 indep=this.independents[i];
127 if (!(isNaN(indep.fos_forward_index))){
128 index=index+indep.fos_forward_index;
129 break;
130 }
131 else{
132 if (indep.type=='scalar') index=index+1;
133 else index=index+indep.nods;
134 }
135 }
136 index=index-1; //get c-index numbering going
137 WriteData(fid,prefix,'data',index,'name','md.autodiff.fos_forward_index','format','Integer');
138 }
139 //}}}
140 //if driver is fos_reverse, build index: {{{
141 if (this.driver == 'fos_reverse'){
142 var index=0;
143
144 for (var i=0;i<num_dependent_objects;i++){
145 dep=this.dependents[i];
146 if (!(isNaN(dep.fos_reverse_index))){
147 index=index+dep.fos_reverse_index;
148 break;
149 }
150 else{
151 if (dep.type =='scalar') index=index+1;
152 else index=index+dep.nods;
153 }
154 }
155 index=index-1; //get c-index numbering going
156 WriteData(fid,prefix,'data',index,'name','md.autodiff.fos_reverse_index','format','Integer');
157 }
158 //}}}
159 //if driver is fov_forward, build indices: {{{
160 if (this.driver == 'fov_forward'){
161 var indices=0;
162
163 for (var i=0;i<num_independent_objects;i++){
164 indep=this.independents[i];
165 if (!indep.fos_forward_index.length){
166 indices=indices+indep.fov_forward_indices;
167 break;
168 }
169 else{
170 if (indep.type =='scalar') indices=indices+1;
171 else indices=indices+indep.nods;
172 }
173 }
174 indices=indices-1; //get c-indices numbering going
175 WriteData(fid,prefix,'data',indices,'name','md.autodiff.fov_forward_indices','format','IntMat','mattype',3);
176 }
177 //}}}
178 //deal with mass fluxes: {{{
179 mass_flux_segments=[];
180 for (var i=0;i<num_dependent_objects;i++){
181 dep=this.dependents[i];
182 if (dep.name =='MassFlux'){
183 mass_flux_segments.push(dep.segments);
184 }
185 }
186 if (mass_flux_segments.length){
187 WriteData(fid,prefix,'data',mass_flux_segments,'name','md.autodiff.mass_flux_segments','format','MatArray');
188 flag=true;
189 }
190 else flag=false;
191 WriteData(fid,prefix,'data',flag,'name','md.autodiff.mass_flux_segments_present','format','Boolean');
192 //}}}
193 //deal with trace keep on: {{{
194 keep=false;
195
196 //From ADOLC userdoc:
197 // The optional integer argument keep of trace on determines whether the numerical values of all active variables are
198 // recorded in a buffered temporary array or file called the taylor stack. This option takes effect if keep = 1 and
199 // prepares the scene for an immediately following gradient evaluation by a call to a routine implementing the reverse
200 // mode as described in the Section 4 and Section 5.
201 //
202
203 if (this.driver.length<=3) keep=false; //there is no "_reverse" string within the driver string:
204 else{
205 if (this.driver.splice(4) == '_reverse') keep=true;
206 else keep=false;
207 }
208 WriteData(fid,prefix,'data',keep,'name','md.autodiff.keep','format','Boolean');
209 //}}}
210 }//}}}
211 this.fix=function() { //{{{
212 this.obufsize=NullFix(this.obufsize,NaN);
213 this.lbufsize=NullFix(this.lbufsize,NaN);
214 this.cbufsize=NullFix(this.cbufsize,NaN);
215 this.tbufsize=NullFix(this.tbufsize,NaN);
216 this.gcTriggerRatio=NullFix(this.gcTriggerRatio,NaN);
217 this.gcTriggerMaxSize=NullFix(this.gcTriggerMaxSize,NaN);
218 }//}}}
219 //properties
220 // {{{
221 this.isautodiff = false;
222 this.dependents = [];
223 this.independents = [];
224 this.driver = 'fos_forward';
225 this.obufsize = NaN;
226 this.lbufsize = NaN;
227 this.cbufsize = NaN;
228 this.tbufsize = NaN;
229 this.gcTriggerRatio = NaN;
230 this.gcTriggerMaxSize = NaN;
231
232 this.setdefaultparameters();
233 //}}}
234}
Note: See TracBrowser for help on using the repository browser.