/[escript]/trunk/finley/src/CPPAdapter/MeshAdapter.cpp
ViewVC logotype

Diff of /trunk/finley/src/CPPAdapter/MeshAdapter.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 757 by woo409, Mon Jun 26 13:12:56 2006 UTC revision 967 by gross, Tue Feb 13 09:40:12 2007 UTC
# Line 13  Line 13 
13   ******************************************************************************   ******************************************************************************
14  */  */
15    
16    #ifdef PASO_MPI
17    #include <mpi.h>
18    #endif
19  #include "MeshAdapter.h"  #include "MeshAdapter.h"
20    
21  #include "escript/Data.h"  #include "escript/Data.h"
# Line 252  void MeshAdapter::addPDEToSystem( Line 255  void MeshAdapter::addPDEToSystem(
255                       const escript::Data& d, const escript::Data& y,                       const escript::Data& d, const escript::Data& y,
256                       const escript::Data& d_contact,const escript::Data& y_contact) const                       const escript::Data& d_contact,const escript::Data& y_contact) const
257  {  {
258    escriptDataC _rhs=rhs.getDataC();     escriptDataC _rhs=rhs.getDataC();
259    escriptDataC _A  =A.getDataC();     escriptDataC _A  =A.getDataC();
260    escriptDataC _B=B.getDataC();     escriptDataC _B=B.getDataC();
261    escriptDataC _C=C.getDataC();     escriptDataC _C=C.getDataC();
262    escriptDataC _D=D.getDataC();     escriptDataC _D=D.getDataC();
263    escriptDataC _X=X.getDataC();     escriptDataC _X=X.getDataC();
264    escriptDataC _Y=Y.getDataC();     escriptDataC _Y=Y.getDataC();
265    escriptDataC _d=d.getDataC();     escriptDataC _d=d.getDataC();
266    escriptDataC _y=y.getDataC();     escriptDataC _y=y.getDataC();
267    escriptDataC _d_contact=d_contact.getDataC();     escriptDataC _d_contact=d_contact.getDataC();
268    escriptDataC _y_contact=y_contact.getDataC();     escriptDataC _y_contact=y_contact.getDataC();
269    
270     Finley_Mesh* mesh=m_finleyMesh.get();     Finley_Mesh* mesh=m_finleyMesh.get();
    Finley_Assemble_PDE(mesh->Nodes,mesh->Elements,mat.getPaso_SystemMatrix(), &_rhs, &_A, &_B, &_C, &_D, &_X, &_Y );  
271    
272       Finley_Assemble_PDE(mesh->Nodes,mesh->Elements,mat.getPaso_SystemMatrix(), &_rhs, &_A, &_B, &_C, &_D, &_X, &_Y );
273     checkFinleyError();     checkFinleyError();
274    
275     Finley_Assemble_RobinCondition(mesh->Nodes,mesh->FaceElements, mat.getPaso_SystemMatrix(), &_rhs, &_d, &_y, Finley_Assemble_handelShapeMissMatch_Mean_out);     Finley_Assemble_PDE(mesh->Nodes,mesh->FaceElements, mat.getPaso_SystemMatrix(), &_rhs, 0, 0, 0, &_d, 0, &_y );
276     checkFinleyError();     checkFinleyError();
277    
278     Finley_Assemble_RobinCondition(mesh->Nodes,mesh->ContactElements, mat.getPaso_SystemMatrix(), &_rhs , &_d_contact, &_y_contact ,             Finley_Assemble_handelShapeMissMatch_Step_out);     Finley_Assemble_PDE(mesh->Nodes,mesh->ContactElements, mat.getPaso_SystemMatrix(), &_rhs , 0, 0, 0, &_d_contact, 0, &_y_contact );
279     checkFinleyError();     checkFinleyError();
280  }  }
281    
# Line 283  void MeshAdapter::addPDEToRHS( escript:: Line 286  void MeshAdapter::addPDEToRHS( escript::
286  {  {
287     Finley_Mesh* mesh=m_finleyMesh.get();     Finley_Mesh* mesh=m_finleyMesh.get();
288    
289     // Finley_Assemble_PDE_RHS(mesh->Nodes,mesh->Elements,&(rhs.getDataC()),&(X.getDataC()),&(Y.getDataC()));     escriptDataC _rhs=rhs.getDataC();
290     Finley_Assemble_PDE(mesh->Nodes,mesh->Elements,0,&(rhs.getDataC()),0,0,0,0,&(X.getDataC()),&(Y.getDataC()));     escriptDataC _X=X.getDataC();
291     checkFinleyError();     escriptDataC _Y=Y.getDataC();
292       escriptDataC _y=y.getDataC();
293       escriptDataC _y_contact=y_contact.getDataC();
294    
295     // Finley_Assemble_RobinCondition_RHS(mesh->Nodes,mesh->FaceElements,&(rhs.getDataC()),&(y.getDataC()),Finley_Assemble_handelShapeMissMatch_Mean_out);     Finley_Assemble_PDE(mesh->Nodes,mesh->Elements, 0, &_rhs, 0, 0, 0, 0, &_X, &_Y );
296     Finley_Assemble_RobinCondition(mesh->Nodes,mesh->FaceElements,0,&(rhs.getDataC()),0,&(y.getDataC()),Finley_Assemble_handelShapeMissMatch_Mean_out);     checkFinleyError();
297    
298       Finley_Assemble_PDE(mesh->Nodes,mesh->FaceElements, 0, &_rhs, 0, 0, 0, 0, 0, &_y );
299     checkFinleyError();     checkFinleyError();
300     Finley_Assemble_RobinCondition(mesh->Nodes,mesh->ContactElements,0,&(rhs.getDataC()),0,&(y_contact.getDataC()),Finley_Assemble_handelShapeMissMatch_Step_out);  
301     // Finley_Assemble_RobinCondition_RHS(mesh->Nodes,mesh->ContactElements,&(rhs.getDataC()),&(y_contact.getDataC()),Finley_Assemble_handelShapeMissMatch_Step_out);     Finley_Assemble_PDE(mesh->Nodes,mesh->ContactElements, 0, &_rhs , 0, 0, 0, 0, 0, &_y_contact );
302     checkFinleyError();     checkFinleyError();
303  }  }
304    
# Line 716  void MeshAdapter::saveDX(const std::stri Line 722  void MeshAdapter::saveDX(const std::stri
722      for (int i=0;i<num_data;++i) {      for (int i=0;i<num_data;++i) {
723           escript::Data& d=boost::python::extract<escript::Data&>(arg[keys[i]]);           escript::Data& d=boost::python::extract<escript::Data&>(arg[keys[i]]);
724           if (dynamic_cast<const MeshAdapter&>(d.getFunctionSpace().getDomain()) !=*this)           if (dynamic_cast<const MeshAdapter&>(d.getFunctionSpace().getDomain()) !=*this)
725               throw FinleyAdapterException("Error  in saveVTK: Data must be defined on same Domain");               throw FinleyAdapterException("Error  in saveDX: Data must be defined on same Domain");
726           data[i]=d.getDataC();           data[i]=d.getDataC();
727           ptr_data[i]=&(data[i]);           ptr_data[i]=&(data[i]);
728           std::string n=boost::python::extract<std::string>(keys[i]);           std::string n=boost::python::extract<std::string>(keys[i]);
# Line 776  void MeshAdapter::saveVTK(const std::str Line 782  void MeshAdapter::saveVTK(const std::str
782              strcpy(c_names[i],n.c_str());              strcpy(c_names[i],n.c_str());
783           }           }
784      }      }
785    #ifndef PASO_MPI    
786      Finley_Mesh_saveVTK(filename.c_str(),m_finleyMesh.get(),num_data,c_names,ptr_data);      Finley_Mesh_saveVTK(filename.c_str(),m_finleyMesh.get(),num_data,c_names,ptr_data);
787      checkFinleyError();  #else
788        Finley_Mesh_saveVTK_MPIO(filename.c_str(),m_finleyMesh.get(),num_data,c_names,ptr_data);
789    #endif
790    
791    checkFinleyError();
792    /* win32 refactor */    /* win32 refactor */
793    TMPMEMFREE(c_names);    TMPMEMFREE(c_names);
794    TMPMEMFREE(data);    TMPMEMFREE(data);
# Line 1033  int MeshAdapter::getTagFromSampleNo(int Line 1044  int MeshAdapter::getTagFromSampleNo(int
1044    }    }
1045    return out;    return out;
1046  }  }
1047  int MeshAdapter::getReferenceNoFromSampleNo(int functionSpaceType, int sampleNo) const  int* MeshAdapter::borrowSampleReferenceIDs(int functionSpaceType) const
1048  {  {
1049    int out=0,i;    int *out=0,i;
1050    Finley_Mesh* mesh=m_finleyMesh.get();    Finley_Mesh* mesh=m_finleyMesh.get();
1051    switch (functionSpaceType) {    switch (functionSpaceType) {
1052    case(Nodes):    case(Nodes):
1053      if (mesh->Nodes!=NULL) {      if (mesh->Nodes!=NULL) {
1054        out=mesh->Nodes->Id[sampleNo];        out=mesh->Nodes->Id;
1055        break;        break;
1056      }      }
1057    case(Elements):    case(Elements):
1058      out=mesh->Elements->Id[sampleNo];      out=mesh->Elements->Id;
1059      break;      break;
1060    case(FaceElements):    case(FaceElements):
1061      out=mesh->FaceElements->Id[sampleNo];      out=mesh->FaceElements->Id;
1062      break;      break;
1063    case(Points):    case(Points):
1064      out=mesh->Points->Id[sampleNo];      out=mesh->Points->Id;
1065      break;      break;
1066    case(ContactElementsZero):    case(ContactElementsZero):
1067      out=mesh->ContactElements->Id[sampleNo];      out=mesh->ContactElements->Id;
1068      break;      break;
1069    case(ContactElementsOne):    case(ContactElementsOne):
1070      out=mesh->ContactElements->Id[sampleNo];      out=mesh->ContactElements->Id;
1071      break;      break;
1072    case(DegreesOfFreedom):    case(DegreesOfFreedom):
1073      for (i=0;i<mesh->Nodes->numNodes; ++i) {      out=mesh->Nodes->degreeOfFreedomId;
        if (mesh->Nodes->degreeOfFreedom[i]==sampleNo) {  
           out=mesh->Nodes->Id[i];  
           break;  
        }  
     }  
1074      break;      break;
1075    case(ReducedDegreesOfFreedom):    case(ReducedDegreesOfFreedom):
1076      for (i=0;i<mesh->Nodes->numNodes; ++i) {      out=mesh->Nodes->reducedDegreeOfFreedomId;
        if (mesh->Nodes->reducedDegreeOfFreedom[i]==sampleNo) {  
           out=mesh->Nodes->Id[i];  
           break;  
        }  
     }  
1077      break;      break;
1078    default:    default:
1079      stringstream temp;      stringstream temp;
# Line 1083  int MeshAdapter::getReferenceNoFromSampl Line 1084  int MeshAdapter::getReferenceNoFromSampl
1084    return out;    return out;
1085  }  }
1086    
1087    void MeshAdapter::setTags(const int functionSpaceType, const int newTag, const escript::Data& mask) const
1088    {
1089      Finley_Mesh* mesh=m_finleyMesh.get();
1090      escriptDataC tmp=mask.getDataC();
1091      switch(functionSpaceType) {
1092           case(Nodes):
1093              Finley_NodeFile_setTags(mesh->Nodes,newTag,&tmp);
1094              break;
1095           case(DegreesOfFreedom):
1096              throw FinleyAdapterException("Error - DegreesOfFreedom does not support tags");
1097              break;
1098           case(ReducedDegreesOfFreedom):
1099              throw FinleyAdapterException("Error - ReducedDegreesOfFreedom does not support tags");
1100              break;
1101           case(Elements):
1102              Finley_ElementFile_setTags(mesh->Elements,newTag,&tmp);
1103              break;
1104           case(FaceElements):
1105              Finley_ElementFile_setTags(mesh->FaceElements,newTag,&tmp);
1106              break;
1107           case(Points):
1108              Finley_ElementFile_setTags(mesh->Points,newTag,&tmp);
1109              break;
1110           case(ContactElementsZero):
1111              Finley_ElementFile_setTags(mesh->ContactElements,newTag,&tmp);
1112              break;
1113           case(ContactElementsOne):
1114              Finley_ElementFile_setTags(mesh->ContactElements,newTag,&tmp);
1115              break;
1116           default:
1117              stringstream temp;
1118              temp << "Error - Finley does not know anything about function space type " << functionSpaceType;
1119              throw FinleyAdapterException(temp.str());
1120      }
1121      checkFinleyError();
1122      return;
1123    }
1124    
1125    
1126  }  // end of namespace  }  // end of namespace

Legend:
Removed from v.757  
changed lines
  Added in v.967

  ViewVC Help
Powered by ViewVC 1.1.26