Ignore:
Timestamp:
11/23/15 10:31:37 (9 years ago)
Author:
Eric.Larour
Message:

CHG: finished implementation of the marshall routine ,based on writing to a typed array buffer. No file
i/o involved at this point. Fake memory based file i/o is implemented in WriteData.js and used throughout the
classes marshall methods.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/m/classes/autodiff.js

    r19787 r19791  
    3131
    3232        }// }}}
     33        this.classname= function(){// {{{
     34                return "autodiff";
     35        }// }}}
    3336                this.checkconsistency = function(md,solution,analyses){ //{{{
    3437
     
    5760                        }
    5861                } // }}}
     62                this.marshall=function(md,fid) { //{{{
     63
     64                        WriteData(fid,'object',this,'fieldname','isautodiff','format','Boolean');
     65                        WriteData(fid,'object',this,'fieldname','driver','format','String');
     66
     67                        //early return
     68                        if (!this.isautodiff){
     69                                WriteData(fid,'data',false,'enum',AutodiffMassFluxSegmentsPresentEnum(),'format','Boolean');
     70                                WriteData(fid,'data',false,'enum',AutodiffKeepEnum(),'format','Boolean');
     71                                return;
     72                        }
     73
     74                        //buffer sizes {{{
     75                        WriteData(fid,'object',this,'fieldname','obufsize','format','Double');
     76                        WriteData(fid,'object',this,'fieldname','lbufsize','format','Double');
     77                        WriteData(fid,'object',this,'fieldname','cbufsize','format','Double');
     78                        WriteData(fid,'object',this,'fieldname','tbufsize','format','Double');
     79                        WriteData(fid,'object',this,'fieldname','gcTriggerRatio','format','Double');
     80                        WriteData(fid,'object',this,'fieldname','gcTriggerMaxSize','format','Double');
     81                        //}}}
     82                        //process dependent variables {{{
     83                        num_dependent_objects=this.dependents.length;
     84                        WriteData(fid,'data',num_dependent_objects,'enum',AutodiffNumDependentObjectsEnum(),'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,'data',names,'enum',AutodiffDependentObjectNamesEnum(),'format','StringArray');
     99                                WriteData(fid,'data',types,'enum',AutodiffDependentObjectTypesEnum(),'format','IntMat','mattype',3);
     100                                WriteData(fid,'data',indices,'enum',AutodiffDependentObjectIndicesEnum(),'format','IntMat','mattype',3);
     101                        }
     102                        //}}}
     103                        //process independent variables {{{
     104                        num_independent_objects=this.independents.length;
     105                        WriteData(fid,'data',num_independent_objects,'enum',AutodiffNumIndependentObjectsEnum(),'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]=StringToEnum(indep.name);
     115                                        types[i]=indep.typetoscalar();
     116                                }
     117                                WriteData(fid,'data',names,'enum',AutodiffIndependentObjectNamesEnum(),'format','IntMat','mattype',3);
     118                                WriteData(fid,'data',types,'enum',AutodiffIndependentObjectTypesEnum(),'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,'data',index,'enum',AutodiffFosForwardIndexEnum(),'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,'data',index,'enum',AutodiffFosReverseIndexEnum(),'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,'data',indices,'enum',AutodiffFovForwardIndicesEnum(),'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,'data',mass_flux_segments,'enum',MassFluxSegmentsEnum(),'format','MatArray');
     188                                flag=true;
     189                        }
     190                        else flag=false;
     191                        WriteData(fid,'data',flag,'enum',AutodiffMassFluxSegmentsPresentEnum(),'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,'data',keep,'enum',AutodiffKeepEnum(),'format','Boolean');
     209                        //}}}
     210                }//}}}
    59211        //properties
    60212        // {{{
Note: See TracChangeset for help on using the changeset viewer.