Changeset 22070
- Timestamp:
- 2014-09-01T15:06:21+02:00 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Compiler/Template/CodegenCpp.tpl
r22065 r22070 159 159 void calc<%name%>JacobianColumn(); 160 160 void get<%name%>Jacobian(SparseMatrix& matrix); 161 /*needed for colored Jacs*/ 161 162 >> 162 163 ;separator="\n";empty) … … 165 166 >> 166 167 %> 167 private: 168 168 169 169 170 … … 172 173 let jacobianvars = (jacobianMatrixes |> (_,_, name, _, _, _, _) hasindex index0 => 173 174 << 175 private: 174 176 SparseMatrix _<%name%>jacobian; 175 177 ublas::vector<double> _<%name%>jac_y; 176 178 ublas::vector<double> _<%name%>jac_tmp; 177 179 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 178 194 >> 179 195 ;separator="\n";empty) … … 191 207 ;separator="") 192 208 %> 193 209 210 /*testmässig aus der Cruntime*/ 211 212 <%functionAnalyticJacobiansHeader(jacobianMatrixes, modelNamePrefix(simCode))%> 213 194 214 }; 195 215 >> … … 197 217 198 218 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 226 case {} then 227 << 228 >> 229 case _ 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 292 end match*/ 293 //end initialAnalyticJacobiansHeader; 200 294 201 295 … … 355 449 virtual bool getAMatrix(unsigned int index,DynArrayDim1<int>& A); 356 450 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 359 464 }; 360 465 >> … … 435 540 } 436 541 <%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 437 554 >> 438 555 end simulationJacobianCppFile; 439 440 441 442 556 443 557 template simulationStateSelectionCppFile(SimCode simCode, Boolean useFlatArrayNotation) … … 557 671 <%lastIdentOfPath(modelInfo.name)%>Initialize::initialize(); 558 672 <%lastIdentOfPath(modelInfo.name)%>Jacobian::initialize(); 559 673 674 675 <%lastIdentOfPath(modelInfo.name)%>Jacobian::initializeColoredJacobianA(); 560 676 561 677 } … … 667 783 <%lastIdentOfPath(modelInfo.name)%>StateSelection::setAMatrix(index,A); 668 784 } 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 } 670 824 >> 671 825 end simulationExtensionCppFile; … … 4549 4703 4550 4704 virtual int getDimTimeEvent() const; 4551 //gibt die Time events (Startzeit und Frequenz) zur ück4705 //gibt die Time events (Startzeit und Frequenz) zurück 4552 4706 virtual void getTimeEvent(time_event_type& time_events); 4553 4707 //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 ) … … 6748 6902 else expTypeFlag(ty, 9) 6749 6903 end match 6904 6750 6905 case 9 then 6751 6906 // we want the "modelica type" … … 11337 11492 11338 11493 11339 11340 11341 11494 template 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 11517 end functionAnalyticJacobians2; 11518 11519 11520 template 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 ::= 11525 match seedVars 11526 case {} then 11527 << 11528 >> 11529 case _ 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 11616 end match 11617 end initialAnalyticJacobians2; 11618 11619 template symbolName(String modelNamePrefix, String symbolName) 11620 "Creates a unique name for the function" 11621 ::= 11622 modelNamePrefix + "_" + symbolName 11623 end symbolName; 11624 11625 11626 template mkSparseFunction(String matrixname, String matrixIndex, DAE.ComponentRef cref, list<DAE.ComponentRef> indexes, String modelNamePrefix) 11627 "generate " 11628 ::= 11629 match 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 >> 11651 end match 11652 end mkSparseFunction; 11653 11654 11655 template 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 11678 end functionAnalyticJacobiansHeader; 11679 11680 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) 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 ::= 11685 match seedVars 11686 case {} then 11687 << 11688 >> 11689 case _ 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 11745 end 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 11780 template mkSparseFunctionHeader(String matrixname, String matrixIndex, DAE.ComponentRef cref, list<DAE.ComponentRef> indexes, String modelNamePrefix) 11781 "generate " 11782 ::= 11783 match matrixname 11784 case "A" then 11785 << 11786 void initializeColumnsColoredJacobian<%matrixname%>_<%matrixIndex%>();<%\n%> 11787 >> 11788 end match 11789 end mkSparseFunctionHeader; 11342 11790 11343 11791 template 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) … … 11618 12066 ::= 11619 12067 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%>' 11621 12070 ;separator="\n") 11622 12071 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%>' 11624 12074 ;separator="\n") 11625 12075 /* 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.