Beispiel #1
0
    ProblemData* InputData ( Problem *problem )
{
#ifdef PARALLEL
	// Get the run suffix to enable viewing with paraview
	int myPID = 0, numProcs=1, strSize=30;
	MPI_Comm_rank(MPI_COMM_WORLD, &myPID), MPI_Comm_size(MPI_COMM_WORLD, &numProcs);
	int numDigits = std::floor(std::log10(numProcs))+1;
	char *exoSuffix=(char*) alloca(sizeof(char)*strSize), formatStr[] = ".%i.%0\0\0\0\0\0\0\0\0", *nemFolder=(char*) alloca(sizeof(char)*strSize);
	std::strncpy(exoSuffix,"\0",strSize), std::strncpy(nemFolder,"\0",strSize);
	std::sprintf(formatStr+6,"%ii",numDigits);
	std::sprintf(exoSuffix,formatStr,numProcs,myPID);
	std::sprintf(nemFolder,"./nem-%i/",numProcs);
#endif

    // Local variables
    ParseInputHelper parseInputHelper = ParseInputHelper();

    // Create the ProblemData,MeshData,SolverData, and ModelData
    ProblemData* pd        = problem->GetProblemData();
    MeshData*   meshData   = pd->CreateMeshDataStruct();
    SolverData* solverData = pd->CreateSolverDataStruct();
    ModelData*  modelData  = pd->CreateModelDataStruct();
    meshData->mMeshFileData           = new MeshFileData();
    solverData->mTimeSolverData       = new TimeSolverData();
    solverData->mNonlinearSolverDataList.push_back(new NonlinearSolverData());
    solverData->mLinearSolverDataList.push_back(new LinearSolverData());
    modelData->mModelFileData         = new ModelFileData();
    modelData->mStrucModelData        = new StrucModelData();
    SolutionData* solutionData        = new SolutionData();
    modelData->mSolutionData.push_back( solutionData );


///Set Problem and Mesh
    meshData->SetMeshId ( 1 );
    meshData->mMeshFileData->mMeshFileType = MESH_EXODUS;
    const char* InputMeshName             = "beam2D.g";
#ifdef PARALLEL
	std::sprintf(meshData->mMeshFileData->mMeshFileBase, "%s%s"  , nemFolder, InputMeshName );
	std::sprintf(meshData->mMeshFileData->mMeshFile    , "%s%s%s", nemFolder, InputMeshName, exoSuffix );
#else
	std::sprintf(meshData->mMeshFileData->mMeshFileBase, "%s", InputMeshName );
	std::sprintf(meshData->mMeshFileData->mMeshFile    , "%s", InputMeshName );
#endif


/// Time Integration options
    solverData->SetSolverId ( 1 );
    solverData->mTimeSolverData->mType           = TIME_SOLVER_FEMDOC_BDF;
    solverData->mTimeSolverData->mBdfOrder       = 2;
    solverData->mTimeSolverData->mTime           = 0.0;
    solverData->mTimeSolverData->mTimeIts        = sNumIts;
    solverData->mTimeSolverData->mTimeItList[0]  = solverData->mTimeSolverData->mTimeIts;
    solverData->mTimeSolverData->mDt             = sTimeStep;
    solverData->mTimeSolverData->mDtList[0]      = solverData->mTimeSolverData->mDt;
//    solverData->mTimeSolverData->mMaxTime         = solverData->mTimeSolverData->mTimeIts*solverData->mTimeSolverData->mDt;
    solverData->mTimeSolverData->mBeta           = 0.25;           // Newmark Alpha
    solverData->mTimeSolverData->mGamma          = 0.5;            // Newmark Delta
    solverData->mTimeSolverData->mAlphaF         = 0.0;
    solverData->mTimeSolverData->mAlphaM         = 0.0;
    solverData->mTimeSolverData->mTotResNorm     = 1.0e-12;
    solverData->mTimeSolverData->mTotResNormDrop = 1.0e-12;
    solverData->mTimeSolverData->mNondimDivisor  = 1.0;

    solverData->mTimeSolverData->mJacCheck = false;
    solverData->mTimeSolverData->mNaNCheck = false;
    
        solverData->mTimeSolverData->mReinitByStandaloneFile = true;
    const char* tempPath = "tempDir/";
    solverData->mTimeSolverData->mSolVecDir = new char[200];
    strcpy(solverData->mTimeSolverData->mSolVecDir,tempPath);


/// Newton solver and linear solver options
    solverData->mNonlinearSolverDataList[0]->mType             = NONLINEAR_SOLVER_FEMDOC_NEWTON;
    solverData->mNonlinearSolverDataList[0]->mMaxItsList[0]    = 10;
    solverData->mNonlinearSolverDataList[0]->mRelaxation       = 1.0;
    solverData->mNonlinearSolverDataList[0]->mRlxList[0]       = solverData->mNonlinearSolverDataList[0]->mRelaxation;
    solverData->mNonlinearSolverDataList[0]->mTotResNormDrop   = 1.0e-3;
    solverData->mNonlinearSolverDataList[0]->mTotResNorm       = 1.0e-20;

/// Linear solver options
	solverData->mLinearSolverDataList[0]->mSparseMatrixType    = SPARSE_MATRIX_TRILINOS_EPETRA_FECRS;

//	solverData->mLinearSolverDataList[0]->mType                = LINSOL_TRILINOS_AMESOS;
//#ifdef PARALLEL
//	solverData->mLinearSolverDataList[0]->mMethod              = LINSOL_AMESOS_MUMPS;
//#else
//	solverData->mLinearSolverDataList[0]->mMethod              = LINSOL_AMESOS_UMFPACK;
//#endif
//	solverData->mLinearSolverDataList[0]->mExport          = LINSOL_EXPORT_MATLAB;

	solverData->mLinearSolverDataList[0]->mType             = LINSOL_TRILINOS_AZTEC;
	solverData->mLinearSolverDataList[0]->mMethod           = LINSOL_AZTEC_GMRES;
	solverData->mLinearSolverDataList[0]->mPreconditioner   = LINSOL_PREC_AZTEC_DD_ILUT;
	solverData->mLinearSolverDataList[0]->mKrylovSpace      = 500;
	solverData->mLinearSolverDataList[0]->mMaxIts           = 3000;
	solverData->mLinearSolverDataList[0]->mDropTol          = 1.0e-09;
	solverData->mLinearSolverDataList[0]->mGraphFill        = 1;
	solverData->mLinearSolverDataList[0]->mIlutFill         = 7.0;
	solverData->mLinearSolverDataList[0]->mPolyOrder        = 3;
	solverData->mLinearSolverDataList[0]->mAlphaThresh      = 0.0;
	solverData->mLinearSolverDataList[0]->mRhoThresh        = 0.0;
	solverData->mLinearSolverDataList[0]->mEpsilon          = 1.0e-09;
	solverData->mLinearSolverDataList[0]->mOverlap          = 1;
	solverData->mLinearSolverDataList[0]->mReorder          = 1;

	solverData->mLinearSolverDataList[0]->mHardBreak        = false;
	solverData->mLinearSolverDataList[0]->mOutput           = LINSOL_OUTPUT_ALL;



/// Model Data
    modelData->SetModelId( 1 );
    modelData->mMeshId                        = 1;
    modelData->mSolverId                      = 1;
    modelData->mModelFileData->mModelFileType = MODEL_FEMDOC;
    modelData->mStrucModelData->mRedDimType   = PLANE_STRAIN;
//    strcpy(modelData->mModelFileData->mIniLevelSetFile,"./IniLSStrucBeam.so");

	modelData->mXFemCurvatureSearchRadius = sCurvatureSearchRadius;
	modelData->mXFemCurvatureSpringStiff = sCurvatureSpringStiff;
    modelData->mdScalar_ds_byAdv = false;

/// Solution writing format
    solutionData->mSolnFormatType = SF_EXODUS;
    const char* OutputMeshBase   = "beam2D.e-s";
    solutionData->mSaveIC         = sSaveIC;
    solutionData->mOptSaveFreq    = 1;
    solutionData->mSaveOpt        = true;
    solutionData->mIsXFem         = (sXfemBlockElemType!=NON_XFEM_ELEMENT);
    strcpy(solutionData->mSolnFileBase,OutputMeshBase);
    strcpy(solutionData->mSolnFileName,OutputMeshBase);
#ifdef PARALLEL
	std::sprintf(solutionData->mSolnFileBase, "%s%s", nemFolder, OutputMeshBase );
	std::sprintf(solutionData->mSolnFileName, "%s%s", nemFolder, OutputMeshBase );
#else
	std::sprintf(solutionData->mSolnFileBase, "%s", OutputMeshBase );
	std::sprintf(solutionData->mSolnFileName, "%s", OutputMeshBase );
#endif

/// Post Processing Output Variables
    parseInputHelper.CreateNodalOutputVariables   (solutionData, SOL_UX               , ELEM_VAR, 1, sBSetIds );
    parseInputHelper.CreateNodalOutputVariables   (solutionData, SOL_UY               , ELEM_VAR, 1, sBSetIds );
    parseInputHelper.CreateNodalOutputVariables   (solutionData, SOL_UX_XFEM          , ELEM_VAR, 1, sBSetIds );
    parseInputHelper.CreateNodalOutputVariables   (solutionData, SOL_UY_XFEM          , ELEM_VAR, 1, sBSetIds );
    parseInputHelper.CreateNodalOutputVariables   (solutionData, SOL_NP_LEVELSET      , ELEM_VAR, 1, sBSetIds );
    parseInputHelper.CreateNodalOutputVariables   (solutionData, SOL_STRUC_SXX        , ELEM_VAR, 1, sBSetIds  );
    parseInputHelper.CreateNodalOutputVariables   (solutionData, SOL_STRUC_SYY        , ELEM_VAR, 1, sBSetIds  );
    parseInputHelper.CreateNodalOutputVariables   (solutionData, SOL_STRUC_SZZ        , ELEM_VAR, 1, sBSetIds  );
    parseInputHelper.CreateNodalOutputVariables   (solutionData, SOL_STRUC_SXY        , ELEM_VAR, 1, sBSetIds  );
    parseInputHelper.CreateNodalOutputVariables   (solutionData, SOL_STRUC_SHY        , ELEM_VAR, 1, sBSetIds  );
    parseInputHelper.CreateNodalOutputVariables   (solutionData, SOL_STRUC_SVM        , ELEM_VAR, 1, sBSetIds  );

	parseInputHelper.CreateNodalOutputVariables( solutionData,     SOL_OBJ_SENS, ELEM_VAR, 1, sBSetIds );
	parseInputHelper.CreateNodalOutputVariables( solutionData, SOL_CONST_1_SENS, ELEM_VAR, 1, sBSetIds );
	parseInputHelper.CreateNodalOutputVariables( solutionData, SOL_INTERFACE_CURVATURE_BEAM_LAGRANGE, ELEM_VAR, 1, sBSetIds );

//    for (UInt ie = 0; ie <(sNumDofsPerNodeMax*MAX_NUM_ENRICHMENTS); ++ie)
//    for (UInt ie = 0; ie <(sNumDofsPerNodeMax*MAX_NUM_ENRICHMENTS_2D); ++ie)  // NOTE:: Only use if code was compiled with the hack MAX_NUM_ENRICHMENTS=MAX_NUM_ENRICHMENTS_2D
//        parseInputHelper.CreateNodalOutputVariables   (solutionData, (SolVarType) (SOL_XFEM000+ie), ELEM_VAR, 1, sBSetIds);

    parseInputHelper.CreateBlockSetOutputVariables(solutionData, SOL_EP_MAIN_PHASE    ,           1, sBSetIds );
    parseInputHelper.CreateBlockSetOutputVariables(solutionData, SOL_STRUC_STEN       ,           1, sBSetIds );

    parseInputHelper.CreateGlobalOutputVariables  (solutionData, GSOL_VOLUME_PHASE_1, ELEM_VAR, 1, sBSetIds , 0, NULL);
    parseInputHelper.CreateGlobalOutputVariables  (solutionData, GSOL_VOLUME_PHASE_2, ELEM_VAR, 1, sBSetIds , 0, NULL);
    parseInputHelper.CreateGlobalOutputVariables  (solutionData,  GSOL_STRAIN_ENERGY, ELEM_VAR, 1, sBSetIds , 0, NULL);
    parseInputHelper.CreateGlobalOutputVariables  (solutionData,      GSOL_PERIMETER, ELEM_VAR, 1, sBSetIds , 0, NULL);
    parseInputHelper.CreateGlobalOutputVariables  (solutionData, GSOL_CURVATURE_TYPE, ELEM_VAR, 1, sBSetIds , 0, NULL);
    parseInputHelper.CreateGlobalOutputVariables  (solutionData,             GSOL_UX, ELEM_VAR, 1, sBSetIds , 1, (sNSetIds+sLoadNSSetIndx));
    parseInputHelper.CreateGlobalOutputVariables  (solutionData,             GSOL_UY, ELEM_VAR, 1, sBSetIds , 1, (sNSetIds+sLoadNSSetIndx));
    parseInputHelper.CreateGlobalOutputVariables  (solutionData,          GSOL_UX_SQ, ELEM_VAR, 1, sBSetIds , 1, (sNSetIds+sLoadNSSetIndx));
    parseInputHelper.CreateGlobalOutputVariables  (solutionData,          GSOL_UY_SQ, ELEM_VAR, 1, sBSetIds , 1, (sNSetIds+sLoadNSSetIndx));

    return pd;
}