// ############################################################################ // // create_mz_kpp_module // // create scalar code from .f90 sources created by KPP to be used in MESSy // // COPYRIGHT Klaus Ketelsen and MPI-CH April 2007 // // ############################################################################ #include #include #include "expand_decomp.h" #include "utils.h" void expand_decomp::create_sparse_info (vector & include_list, string module_name) { vector::iterator it; vector::iterator ip; bool done; int number; // Generate a dummy vector entry [0] to be compatable with FORTRAN indexing number = 0; LU_IROW.push_back(number); LU_ICOL.push_back(number); LU_CROW.push_back(number); LU_DIAG.push_back(number); cout <get_name() == module_name + "_Parameters") { for (ip=it->pline.begin(); ip != it->pline.end(); ip++) { if(ip->get_token(0).substr(0,7) == "INTEGER" && ip->get_token(3) == "NVAR") { sscanf (ip->get_token(5).c_str(),"%i",&NVAR); cout << " NVAR = "<< NVAR <get_name() == module_name + "_JacobianSP") { for (ip=it->pline.begin(); ip != it->pline.end(); ip++) { if(ip->get_token(0).substr(0,7) == "INTEGER" && ip->get_token(7).substr(0,7) == "LU_IROW") { done = false; while(1) { ip++; for(int i=0; iget_token_size (); i++) { if(ip->get_token(i).substr(0,1) == "/") { done = true; break; } else if(ip->get_token(i).substr(0,1) != "&") { if ( sscanf (ip->get_token(i).c_str(),"%i",&number) == 1) LU_IROW.push_back(number); } } if(done) break; } } } } } cout << "extracted LU_IROW: " << LU_IROW.size()-1 << " values " <get_name() == module_name + "_JacobianSP") { for (ip=it->pline.begin(); ip != it->pline.end(); ip++) { if(ip->get_token(0).substr(0,7) == "INTEGER" && ip->get_token(7).substr(0,7) == "LU_ICOL") { done = false; while(1) { ip++; for(int i=0; iget_token_size (); i++) { if(ip->get_token(i).substr(0,1) == "/") { done = true; break; } else if(ip->get_token(i).substr(0,1) != "&") { if (sscanf (ip->get_token(i).c_str(),"%i",&number) == 1) LU_ICOL.push_back(number); } } if(done) break; } } } } } cout << "extracted LU_ICOL: " << LU_ICOL.size()-1 << " values " <get_name() == module_name + "_JacobianSP") { for (ip=it->pline.begin(); ip != it->pline.end(); ip++) { if(ip->get_token(0).substr(0,7) == "INTEGER" && ip->get_token(7).substr(0,7) == "LU_CROW") { done = false; while(1) { ip++; for(int i=0; iget_token_size (); i++) { if(ip->get_token(i).substr(0,1) == "/") { done = true; break; } else if(ip->get_token(i).substr(0,1) != "&") { if (sscanf (ip->get_token(i).c_str(),"%i",&number) == 1) LU_CROW.push_back(number); } } if(done) break; } } } } } cout << "extracted LU_CROW: " << LU_CROW.size()-1 << " values " <get_name() == module_name + "_JacobianSP") { for (ip=it->pline.begin(); ip != it->pline.end(); ip++) { if(ip->get_token(0).substr(0,7) == "INTEGER" && ip->get_token(7).substr(0,7) == "LU_DIAG") { done = false; while(1) { ip++; for(int i=0; iget_token_size (); i++) { if(ip->get_token(i).substr(0,1) == "/") { done = true; break; } else if(ip->get_token(i).substr(0,1) != "&") { if (sscanf (ip->get_token(i).c_str(),"%i",&number) == 1) LU_DIAG.push_back(number); } } if(done) break; } } } } } cout << "extracted LU_DIAG: " << LU_DIAG.size()-1 << " values " < & routine_list) { vector::iterator it; fortran_file de; int k,kk,j,jj,i; string line; char cline[80]; // Delete original KppDecomp from subroutine list for(it=routine_list.begin();it!=routine_list.end();it++) { if(it->get_name() == "KppDecomp") { routine_list.erase(it); } } de.set_name("KppDecomp"); de.add_line (" SUBROUTINE KppDecomp( JVS, IER) "); de.add_line (" ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "); de.add_line (" ! Sparse LU factorization "); de.add_line (" ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "); de.add_line (" ! Loop expansion generated by kp4 "); de.add_line (" "); de.add_line (" INTEGER :: IER "); // de.add_line (" REAL ( kind=dp ) :: JVS (:), W ( NVAR ), a "); de.add_line (" REAL ( kind=dp ) :: JVS ( LU_NONZERO ), W ( NVAR ), a "); de.add_line (" INTEGER :: k, kk, j, jj "); de.add_line (" "); de.add_line (" a = 0. "); de.add_line (" IER = 0 "); de.add_line (" "); if( kpp_switches.de_indexing () == 1 ) { cout << " *** de-indexing of deomposition algorithm: 1 " < LU_DIAG[k]-1 (%i %i)", k,LU_CROW[k],LU_DIAG[k]-1); line = cline; de.add_line(line); } } } if( kpp_switches.de_indexing () == 2 ) { // No W array required // No data copying // better data reuse int flag [NVAR+1] [NVAR+1]; int index [NVAR+1] [NVAR+1]; int ij,ji,jk,ki; int count; bool term; cout << " *** de-indexing of decomposition algorithm: 2 (fast) " <= LU_CROW[k] ) { // removes unnecessary statements for (kk=LU_CROW[k]; kk<=LU_CROW[k+1]-1; kk++) { sprintf(cline, " JVS ( %i ) = W ( %i )",kk, LU_ICOL[kk]); line = cline; de.add_line(line); } } } } de.add_line (" return "); de.add_line (" "); de.add_line (" End SUBROUTINE KppDecomp "); routine_list.push_back(de); return; }