Changeset 22070


Ignore:
Timestamp:
2014-09-01T15:06:21+02:00 (10 years ago)
Author:
RuedKamp
Message:
  • colored Jacobians
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Compiler/Template/CodegenCpp.tpl

    r22065 r22070  
    159159     void calc<%name%>JacobianColumn();
    160160     void get<%name%>Jacobian(SparseMatrix& matrix);
     161   /*needed for colored Jacs*/
    161162    >>
    162163    ;separator="\n";empty)
     
    165166   >>
    166167   %>
    167    private:
     168
    168169
    169170
     
    172173    let jacobianvars = (jacobianMatrixes |> (_,_, name, _, _, _, _) hasindex index0 =>
    173174    <<
     175  private:
    174176     SparseMatrix _<%name%>jacobian;
    175177     ublas::vector<double> _<%name%>jac_y;
    176178     ublas::vector<double> _<%name%>jac_tmp;
    177179     ublas::vector<double> _<%name%>jac_x;
     180  public:
     181   /*needed for colored Jacs*/
     182     
     183   int  _<%name%>_sizeCols;
     184     int  _<%name%>_sizeRows;
     185   int* _<%name%>_sparsePattern_leadindex;
     186   int  _<%name%>_sizeof_sparsePattern_leadindex;
     187     int* _<%name%>_sparsePattern_index;
     188   int  _<%name%>_sizeof_sparsePattern_index;
     189     int* _<%name%>_sparsePattern_colorCols;   
     190   int  _<%name%>_sizeof_sparsePattern_colorCols;
     191   int  _<%name%>_sparsePattern_maxColors;
     192   
     193   
    178194    >>
    179195    ;separator="\n";empty)
     
    191207     ;separator="")
    192208    %>
    193 
     209 
     210  /*testmässig aus der Cruntime*/
     211 
     212  <%functionAnalyticJacobiansHeader(jacobianMatrixes, modelNamePrefix(simCode))%>
     213 
    194214  };
    195215 >>
     
    197217
    198218
    199 
     219//template initialAnalyticJacobiansHeader(list<JacobianColumn> jacobianColumn, list<SimVar> seedVars, String matrixname, list<tuple<DAE.ComponentRef,list<DAE.ComponentRef>>> sparsepattern, list<list<DAE.ComponentRef>> colorList, Integer maxColor, String modelNamePrefix)
     220/*"template initialAnalyticJacobians
     221  This template generates source code for functions that initialize the sparse-pattern for a single jacobian.
     222  This is a helper of template functionAnalyticJacobians"
     223*/
     224  //::=
     225/*match seedVars
     226case {} then
     227<<
     228>>
     229case _ then
     230  match sparsepattern
     231  case {(_,{})} then
     232    <<
     233  //sinnloser Kommentar
     234    >>
     235  case _ then
     236  match matrixname
     237  case "A" then
     238      let &eachCrefParts = buffer ""
     239
     240      let indexElems = ( sparsepattern |> (cref,indexes) hasindex index0 =>
     241        let &eachCrefParts += mkSparseFunctionHeader(matrixname, index0, cref, indexes, modelNamePrefix)
     242        <<
     243    initializeColumnsColoredJacobian<%matrixname%>_<%index0%>();
     244        >>
     245
     246       
     247      ;separator="\n")
     248      let colorArray = (colorList |> (indexes) hasindex index0 =>
     249        let colorCol = ( indexes |> i_index =>
     250        '_<%matrixname%>_sparsePattern_colorCols[<%cref(i_index, false)%>$pDER<%matrixname%>$indexdiff] = <%intAdd(index0,1)%>; '
     251        ;separator="\n")
     252      '<%colorCol%>'
     253      ;separator="\n")
     254      let indexColumn = (jacobianColumn |> (eqs,vars,indxColumn) => indxColumn;separator="\n")
     255      let index_ = listLength(seedVars)
     256      let sp_size_index =  lengthListElements(splitTuple212List(sparsepattern))
     257      let sizeleadindex = listLength(sparsepattern)
     258   
     259   
     260      <<
     261    public:
     262      <%eachCrefParts%>
     263      void initializeColoredJacobian<%matrixname%>();
     264   
     265      int  _<%matrixname%>_sizeCols;
     266      int  _<%matrixname%>_sizeRows;
     267   
     268   
     269      //_<%matrixname%>_sparsePattern_leadindex = new int[];
     270        //_<%matrixname%>_sparsePattern_index = new int[];
     271        //_<%matrixname%>_sparsePattern_colorCols = new int[<%index_%>];
     272   
     273   
     274      int  _<%matrixname%>_sparsePattern_leadindex[<%sizeleadindex%>];
     275   
     276    int  _<%matrixname%>_sizeof_sparsePattern_leadindex;
     277   
     278      int  _<%matrixname%>_sparsePattern_index[<%sp_size_index%>];
     279   
     280    int  _<%matrixname%>_sizeof_sparsePattern_index;
     281   
     282      int  _<%matrixname%>_sparsePattern_colorCols[<%index_%>];
     283     
     284    int  _<%matrixname%>_sizeof_sparsePattern_colorCols;
     285   
     286    int  _<%matrixname%>_sparsePattern_maxColors;
     287   
     288
     289      >>
     290   end match
     291   end match
     292end match*/
     293//end initialAnalyticJacobiansHeader;
    200294
    201295
     
    355449    virtual bool getAMatrix(unsigned int index,DynArrayDim1<int>& A);
    356450    virtual void setAMatrix(unsigned int index,DynArrayDim1<int>& A);
    357 
    358 
     451  /*colored jacobians*/
     452    virtual void getA_sparsePattern_leadindex(int* A_sparsePattern_leadindex, int size);
     453  virtual int  getA_sizeof_sparsePattern_leadindex();
     454    virtual void getA_sparsePattern_index(int* A_sparsePattern_index, int size);
     455  virtual int  getA_sizeof_sparsePattern_index();
     456    virtual void getA_sparsePattern_colorCols(int* A_sparsePattern_colorCols, int size);
     457  virtual int  getA_sizeof_sparsePattern_colorCols();
     458    virtual int  getA_sparsePattern_maxColors();
     459   
     460
     461 
     462 
     463 
    359464  };
    360465 >>
     
    435540    }
    436541    <%functionAnalyticJacobians(jacobianMatrixes,simCode,useFlatArrayNotation)%>
     542 
     543 
     544  //testmaessig aus der cruntime
     545      /* Jacobians */
     546
     547
     548    <%functionAnalyticJacobians2(jacobianMatrixes, lastIdentOfPath(modelInfo.name))%>
     549
     550    <%\n%>
     551 
     552 
     553 
    437554 >>
    438555end simulationJacobianCppFile;
    439 
    440 
    441 
    442556
    443557template simulationStateSelectionCppFile(SimCode simCode, Boolean useFlatArrayNotation)
     
    557671      <%lastIdentOfPath(modelInfo.name)%>Initialize::initialize();
    558672      <%lastIdentOfPath(modelInfo.name)%>Jacobian::initialize();
    559 
     673   
     674   
     675    <%lastIdentOfPath(modelInfo.name)%>Jacobian::initializeColoredJacobianA();
    560676
    561677    }
     
    667783      <%lastIdentOfPath(modelInfo.name)%>StateSelection::setAMatrix(index,A);
    668784   }
    669 
     785   
     786   /*needed for colored jacobians*/
     787   
     788   void <%lastIdentOfPath(modelInfo.name)%>Extension::getA_sparsePattern_leadindex(int* A_sparsePattern_leadindex, int size)
     789   {
     790    memcpy(A_sparsePattern_leadindex, _A_sparsePattern_leadindex, size * sizeof(int));
     791   }
     792   
     793   void <%lastIdentOfPath(modelInfo.name)%>Extension::getA_sparsePattern_index(int* A_sparsePattern_index, int size)
     794   {
     795    memcpy(A_sparsePattern_index, _A_sparsePattern_index, size * sizeof(int));
     796   }
     797   
     798   void <%lastIdentOfPath(modelInfo.name)%>Extension::getA_sparsePattern_colorCols(int* A_sparsePattern_colorCols, int size)
     799   {
     800    memcpy(A_sparsePattern_colorCols, _A_sparsePattern_colorCols, size * sizeof(int));
     801   }
     802   
     803   int <%lastIdentOfPath(modelInfo.name)%>Extension::getA_sparsePattern_maxColors()
     804   {
     805    return _A_sparsePattern_maxColors;
     806   }
     807   
     808   /*********************************************************************************************/
     809   
     810   int <%lastIdentOfPath(modelInfo.name)%>Extension::getA_sizeof_sparsePattern_colorCols()
     811   {
     812    return _A_sizeof_sparsePattern_colorCols;
     813   }
     814   
     815   int <%lastIdentOfPath(modelInfo.name)%>Extension::getA_sizeof_sparsePattern_leadindex()
     816   {
     817    return _A_sizeof_sparsePattern_leadindex ;
     818   }
     819   
     820   int <%lastIdentOfPath(modelInfo.name)%>Extension::getA_sizeof_sparsePattern_index()
     821   {
     822    return _A_sizeof_sparsePattern_index;
     823   }
    670824 >>
    671825end simulationExtensionCppFile;
     
    45494703
    45504704    virtual int getDimTimeEvent() const;
    4551     //gibt die Time events (Startzeit und Frequenz) zurück
     4705    //gibt die Time events (Startzeit und Frequenz) zurück
    45524706    virtual void getTimeEvent(time_event_type& time_events);
    45534707    //Wird vom Solver zur Behandlung der Time events aufgerufen (wenn zero_sign[i] = 0  kein time event,zero_sign[i] = n  Anzahl von vorgekommen time events )
     
    67486902  else expTypeFlag(ty, 9)
    67496903    end match
     6904 
    67506905  case 9 then
    67516906  // we want the "modelica type"
     
    1133711492
    1133811493
    11339 
    11340 
    11341 
     11494template functionAnalyticJacobians2(list<JacobianMatrix> JacobianMatrixes,String modelNamePrefix) "template functionAnalyticJacobians
     11495  This template generates source code for all given jacobians."
     11496::=
     11497
     11498  let initialjacMats = (JacobianMatrixes |> (mat, vars, name, (sparsepattern,(_,_)), colorList, maxColor, indexJacobian) =>
     11499    initialAnalyticJacobians2(mat, vars, name, sparsepattern, colorList, maxColor, modelNamePrefix); separator="\n")
     11500/*
     11501  let jacMats = (JacobianMatrixes |> (mat, vars, name, sparsepattern, colorList, maxColor, indexJacobian) =>
     11502    generateMatrix(mat, vars, name, modelNamePrefix) ;separator="\n")
     11503*/
     11504  <<
     11505  /*blub*/
     11506  <%initialjacMats%>
     11507 
     11508 
     11509  /*blub*/  /*blub*/
     11510 
     11511 
     11512 
     11513  >> 
     11514 
     11515  //<%jacMats%>
     11516
     11517end functionAnalyticJacobians2;
     11518
     11519
     11520template initialAnalyticJacobians2(list<JacobianColumn> jacobianColumn, list<SimVar> seedVars, String matrixname, list<tuple<DAE.ComponentRef,list<DAE.ComponentRef>>> sparsepattern, list<list<DAE.ComponentRef>> colorList, Integer maxColor, String modelNamePrefix)
     11521"template initialAnalyticJacobians
     11522  This template generates source code for functions that initialize the sparse-pattern for a single jacobian.
     11523  This is a helper of template functionAnalyticJacobians"
     11524::=
     11525match seedVars
     11526case {} then
     11527<<
     11528>>
     11529case _ then
     11530  match sparsepattern
     11531//  case {(_,{})} then
     11532//    <<
     11533//  /*sinnloser Kommentar*/
     11534//    >>
     11535  case _ then
     11536  match matrixname
     11537  case "A" then
     11538      let &eachCrefParts = buffer ""
     11539      let sp_size_index =  lengthListElements(splitTuple212List(sparsepattern))
     11540      let sizeleadindex = listLength(sparsepattern)
     11541      let leadindex = (sparsepattern |> (cref,indexes) hasindex index0 =>
     11542      <<
     11543    _<%matrixname%>_sparsePattern_leadindex[<%cref(cref, false)%>$pDER<%matrixname%>$indexdiff] = <%listLength(indexes)%>;
     11544      >>
     11545   
     11546     
     11547   
     11548      ;separator="\n")
     11549      let indexElems = ( sparsepattern |> (cref,indexes) hasindex index0 =>
     11550        let &eachCrefParts += mkSparseFunction(matrixname, index0, cref, indexes, modelNamePrefix)
     11551        <<
     11552    initializeColumnsColoredJacobian<%matrixname%>_<%index0%>();
     11553        >>
     11554
     11555       
     11556      ;separator="\n")
     11557      let colorArray = (colorList |> (indexes) hasindex index0 =>
     11558        let colorCol = ( indexes |> i_index =>
     11559        '_<%matrixname%>_sparsePattern_colorCols[<%cref(i_index, false)%>$pDER<%matrixname%>$indexdiff] = <%intAdd(index0,1)%>; '
     11560        ;separator="\n")
     11561      '<%colorCol%>'
     11562      ;separator="\n")
     11563      let indexColumn = (jacobianColumn |> (eqs,vars,indxColumn) => indxColumn;separator="\n")
     11564      let tmpvarsSize = (jacobianColumn |> (_,vars,_) => listLength(vars);separator="\n")
     11565      let index_ = listLength(seedVars)
     11566      <<
     11567
     11568      <%eachCrefParts%>
     11569
     11570      void <%modelNamePrefix%>Jacobian::initializeColoredJacobian<%matrixname%>()
     11571      {
     11572
     11573        //_<%matrixname%>_sizeCols = <%index_%>;
     11574        //_<%matrixname%>_sizeRows = <%indexColumn%>;
     11575   
     11576
     11577   
     11578        _<%matrixname%>_sparsePattern_leadindex = new int[<%sizeleadindex%>];
     11579        _<%matrixname%>_sparsePattern_index = new int[<%sp_size_index%>];
     11580        _<%matrixname%>_sparsePattern_colorCols = new int[<%index_%>];
     11581        _<%matrixname%>_sparsePattern_maxColors = <%maxColor%>;
     11582   
     11583   
     11584   
     11585   
     11586   
     11587
     11588   
     11589    _<%matrixname%>_sizeof_sparsePattern_leadindex = <%sizeleadindex%>;
     11590    _<%matrixname%>_sizeof_sparsePattern_index = <%sp_size_index%>;
     11591    _<%matrixname%>_sizeof_sparsePattern_colorCols = <%index_%>;   
     11592   
     11593   
     11594        //<%matrixname%>_jacobian = NULL;
     11595        //<%matrixname%>_sizeTmpVars = <%tmpvarsSize%>;
     11596        //<%matrixname%>_seedVars = (modelica_real*) calloc(<%index_%>,sizeof(modelica_real));
     11597        //<%matrixname%>_resultVars = (modelica_real*) calloc(<%indexColumn%>,sizeof(modelica_real));
     11598        //<%matrixname%>_tmpVars = (modelica_real*) calloc(<%tmpvarsSize%>,sizeof(modelica_real));
     11599   
     11600   
     11601        /* write column ptr of compressed sparse column*/
     11602        <%leadindex%>
     11603        for(int i = 1; i < <%sizeleadindex%> ; i++)
     11604            _<%matrixname%>_sparsePattern_leadindex[i] += _<%matrixname%>_sparsePattern_leadindex[i-1];
     11605
     11606
     11607        /* call functions to write index for each cref */
     11608        <%indexElems%>
     11609
     11610        /* write color array */
     11611        <%colorArray%>
     11612      }
     11613      >>
     11614   end match
     11615   end match
     11616end match
     11617end initialAnalyticJacobians2;
     11618
     11619template symbolName(String modelNamePrefix, String symbolName)
     11620  "Creates a unique name for the function"
     11621::=
     11622  modelNamePrefix + "_" + symbolName
     11623end symbolName;
     11624
     11625
     11626template mkSparseFunction(String matrixname, String matrixIndex, DAE.ComponentRef cref, list<DAE.ComponentRef> indexes, String modelNamePrefix)
     11627"generate "
     11628::=
     11629match matrixname
     11630 case "A" then
     11631    let indexrows = ( indexes |> indexrow hasindex index0 =>
     11632      <<
     11633    i = _<%matrixname%>_sparsePattern_leadindex[<%cref(cref, false)%>$pDER<%matrixname%>$indexdiff] - <%listLength(indexes)%>;
     11634      _<%matrixname%>_sparsePattern_index[i+<%index0%>] = <%cref(indexrow, false)%>$pDER<%matrixname%>$indexdiffed;
     11635      >>     
     11636      ;separator="\n")
     11637
     11638    <<
     11639    void <%modelNamePrefix%>Jacobian::initializeColumnsColoredJacobian<%matrixname%>_<%matrixIndex%>()
     11640    {
     11641      int i;
     11642   
     11643   
     11644      /* write index for cref: <%cref(cref , false)%> */
     11645   
     11646   
     11647      <%indexrows%>
     11648    }
     11649    <%\n%>
     11650    >>
     11651end match
     11652end mkSparseFunction;
     11653
     11654
     11655template functionAnalyticJacobiansHeader(list<JacobianMatrix> JacobianMatrixes,String modelNamePrefix) "template functionAnalyticJacobians
     11656  This template generates source code for all given jacobians."
     11657::=
     11658
     11659  let initialjacMats = (JacobianMatrixes |> (mat, vars, name, (sparsepattern,(_,_)), colorList, maxColor, indexJacobian) =>
     11660    initialAnalyticJacobiansHeader(mat, vars, name, sparsepattern, colorList, maxColor, modelNamePrefix); separator="\n")
     11661/*
     11662  let jacMats = (JacobianMatrixes |> (mat, vars, name, sparsepattern, colorList, maxColor, indexJacobian) =>
     11663    generateMatrix(mat, vars, name, modelNamePrefix) ;separator="\n")
     11664*/
     11665  <<
     11666  /*blub*/
     11667  <%initialjacMats%>
     11668 
     11669 
     11670  /*blub*/  /*blub*/
     11671 
     11672 
     11673 
     11674  >> 
     11675 
     11676  //<%jacMats%>
     11677
     11678end functionAnalyticJacobiansHeader;
     11679
     11680template initialAnalyticJacobiansHeader(list<JacobianColumn> jacobianColumn, list<SimVar> seedVars, String matrixname, list<tuple<DAE.ComponentRef,list<DAE.ComponentRef>>> sparsepattern, list<list<DAE.ComponentRef>> colorList, Integer maxColor, String modelNamePrefix)
     11681"template initialAnalyticJacobians
     11682  This template generates source code for functions that initialize the sparse-pattern for a single jacobian.
     11683  This is a helper of template functionAnalyticJacobians"
     11684::=
     11685match seedVars
     11686case {} then
     11687<<
     11688>>
     11689case _ then
     11690  match sparsepattern
     11691
     11692  case _ then
     11693  match matrixname
     11694  case "A" then
     11695      let &eachCrefParts = buffer ""
     11696
     11697      let indexElems = ( sparsepattern |> (cref,indexes) hasindex index0 =>
     11698        let &eachCrefParts += mkSparseFunctionHeader(matrixname, index0, cref, indexes, modelNamePrefix)
     11699        <<
     11700    initializeColumnsColoredJacobian<%matrixname%>_<%index0%>();
     11701        >>
     11702
     11703       
     11704      ;separator="\n")
     11705      let colorArray = (colorList |> (indexes) hasindex index0 =>
     11706        let colorCol = ( indexes |> i_index =>
     11707        '_<%matrixname%>_sparsePattern_colorCols[<%cref(i_index, false)%>$pDER<%matrixname%>$indexdiff] = <%intAdd(index0,1)%>; '
     11708        ;separator="\n")
     11709      '<%colorCol%>'
     11710      ;separator="\n")
     11711      let indexColumn = (jacobianColumn |> (eqs,vars,indxColumn) => indxColumn;separator="\n")
     11712      let index_ = listLength(seedVars)
     11713      let sp_size_index =  lengthListElements(splitTuple212List(sparsepattern))
     11714      let sizeleadindex = listLength(sparsepattern)
     11715   
     11716   
     11717      <<
     11718    public:
     11719      <%eachCrefParts%>
     11720      void initializeColoredJacobian<%matrixname%>();
     11721   
     11722      //int  _<%matrixname%>_sizeCols;
     11723      //int  _<%matrixname%>_sizeRows;
     11724   
     11725   
     11726      //_<%matrixname%>_sparsePattern_leadindex = new int[];
     11727        //_<%matrixname%>_sparsePattern_index = new int[];
     11728        //_<%matrixname%>_sparsePattern_colorCols = new int[<%index_%>];
     11729   
     11730   
     11731      //int  _<%matrixname%>_sparsePattern_leadindex[<%sizeleadindex%>];
     11732    //int  _<%matrixname%>_sizeof_sparsePattern_leadindex;
     11733    //int  _<%matrixname%>_sparsePattern_index[<%sp_size_index%>];
     11734    //int  _<%matrixname%>_sizeof_sparsePattern_index;
     11735    //int  _<%matrixname%>_sparsePattern_colorCols[<%index_%>];
     11736    //int  _<%matrixname%>_sizeof_sparsePattern_colorCols;
     11737    //int  _<%matrixname%>_sparsePattern_maxColors;
     11738   
     11739
     11740      >>
     11741   end match
     11742   end match
     11743
     11744
     11745end initialAnalyticJacobiansHeader;
     11746
     11747
     11748
     11749
     11750
     11751
     11752
     11753
     11754
     11755
     11756
     11757
     11758
     11759
     11760
     11761
     11762
     11763
     11764
     11765
     11766
     11767
     11768
     11769
     11770
     11771
     11772
     11773
     11774
     11775
     11776
     11777
     11778
     11779
     11780template mkSparseFunctionHeader(String matrixname, String matrixIndex, DAE.ComponentRef cref, list<DAE.ComponentRef> indexes, String modelNamePrefix)
     11781"generate "
     11782::=
     11783match matrixname
     11784 case "A" then
     11785    <<
     11786    void initializeColumnsColoredJacobian<%matrixname%>_<%matrixIndex%>();<%\n%>
     11787    >>
     11788end match
     11789end mkSparseFunctionHeader;
    1134211790
    1134311791template initialAnalyticJacobians(Integer indexJacobian, list<JacobianColumn> jacobianColumn, list<SimVar> seedVars, String matrixName, list<tuple<DAE.ComponentRef,list<DAE.ComponentRef>>> sparsepattern, list<list<DAE.ComponentRef>> colorList,SimCode simCode)
     
    1161812066::=
    1161912067  let diffVarsResult = (diffVars |> var as SIMVAR(name=name) hasindex index0 =>
    11620      '#define <%crefWithoutIndexOperator(name)%>$pDER<%matrixName%>$indexdiff <%index0%>'
     12068     '#define <%cref(name,false)%>$pDER<%matrixName%>$indexdiff <%index0%> /*test for colored jacobians*/
     12069    #define <%crefWithoutIndexOperator(name)%>$pDER<%matrixName%>$indexdiff <%index0%>'
    1162112070    ;separator="\n")
    1162212071    let diffedVarsResult = (diffedVars |> var as SIMVAR(name=name) hasindex index0 =>
    11623      '#define <%crefWithoutIndexOperator(name)%>$pDER<%matrixName%>$indexdiffed <%index0%>'
     12072     '#define <%cref(name,false)%>$pDER<%matrixName%>$indexdiffed <%index0%> /*test for colored jacobians*/
     12073    #define <%crefWithoutIndexOperator(name)%>$pDER<%matrixName%>$indexdiffed <%index0%>'
    1162412074    ;separator="\n")
    1162512075   /* generate at least one print command to have the same index and avoid the strange side effect */
Note: See TracChangeset for help on using the changeset viewer.