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

Last change on this file was 23245, checked in by Mathieu Morlighem, 7 years ago

CHG: added field for CoDiPack

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