void Foam::codedBase::createLibrary ( dynamicCode& dynCode, const dynamicCodeContext& context ) const { bool create = Pstream::master() || (regIOobject::fileModificationSkew <= 0); // not NFS if (create) { // Write files for new library if (!dynCode.upToDate(context)) { // filter with this context dynCode.reset(context); this->prepare(dynCode, context); if (!dynCode.copyOrCreateFiles(true)) { FatalIOErrorInFunction ( context.dict() ) << "Failed writing files for" << nl << dynCode.libRelPath() << nl << exit(FatalIOError); } } if (!dynCode.wmakeLibso()) { FatalIOErrorInFunction ( context.dict() ) << "Failed wmake " << dynCode.libRelPath() << nl << exit(FatalIOError); } } // all processes must wait for compile to finish if (regIOobject::fileModificationSkew > 0) { //- Since the library has only been compiled on the master the // other nodes need to pick this library up through NFS // We do this by just polling a few times using the // fileModificationSkew. const fileName libPath = dynCode.libPath(); off_t mySize = Foam::fileSize(libPath); off_t masterSize = mySize; Pstream::scatter(masterSize); if (debug) { Pout<< endl<< "on processor " << Pstream::myProcNo() << " have masterSize:" << masterSize << " and localSize:" << mySize << endl; } if (mySize < masterSize) { if (debug) { Pout<< "Local file " << libPath << " not of same size (" << mySize << ") as master (" << masterSize << "). Waiting for " << regIOobject::fileModificationSkew << " seconds." << endl; } Foam::sleep(regIOobject::fileModificationSkew); // Recheck local size mySize = Foam::fileSize(libPath); if (mySize < masterSize) { FatalIOErrorInFunction ( context.dict() ) << "Cannot read (NFS mounted) library " << nl << libPath << nl << "on processor " << Pstream::myProcNo() << " detected size " << mySize << " whereas master size is " << masterSize << " bytes." << nl << "If your case is not NFS mounted" << " (so distributed) set fileModificationSkew" << " to 0" << exit(FatalIOError); } } if (debug) { Pout<< endl<< "on processor " << Pstream::myProcNo() << " after waiting: have masterSize:" << masterSize << " and localSize:" << mySize << endl; } } reduce(create, orOp<bool>()); }
void Foam::codedFunctionObject::createLibrary ( dynamicCode& dynCode, const dynamicCodeContext& context ) const { bool create = Pstream::master(); if (create) { // Write files for new library if (!dynCode.upToDate(context)) { // filter with this context dynCode.reset(context); // Set additional rewrite rules dynCode.setFilterVariable("typeName", redirectType_); dynCode.setFilterVariable("codeRead", codeRead_); dynCode.setFilterVariable("codeExecute", codeExecute_); dynCode.setFilterVariable("codeEnd", codeEnd_); //dynCode.setFilterVariable("codeWrite", codeWrite_); // compile filtered C template dynCode.addCompileFile("functionObjectTemplate.C"); dynCode.addCompileFile("FilterFunctionObjectTemplate.C"); // copy filtered H template dynCode.addCopyFile("FilterFunctionObjectTemplate.H"); dynCode.addCopyFile("functionObjectTemplate.H"); dynCode.addCopyFile("IOfunctionObjectTemplate.H"); // debugging: make BC verbose // dynCode.setFilterVariable("verbose", "true"); // Info<<"compile " << redirectType_ << " sha1: " // << context.sha1() << endl; // define Make/options dynCode.setMakeOptions ( "EXE_INC = -g \\\n" "-I$(LIB_SRC)/finiteVolume/lnInclude \\\n" + context.options() + "\n\nLIB_LIBS = \\\n" + " -lOpenFOAM \\\n" + " -lfiniteVolume \\\n" + context.libs() ); if (!dynCode.copyOrCreateFiles(true)) { FatalIOErrorIn ( "codedFunctionObject::createLibrary(..)", context.dict() ) << "Failed writing files for" << nl << dynCode.libRelPath() << nl << exit(FatalIOError); } } if (!dynCode.wmakeLibso()) { FatalIOErrorIn ( "codedFunctionObject::createLibrary(..)", context.dict() ) << "Failed wmake " << dynCode.libRelPath() << nl << exit(FatalIOError); } } // all processes must wait for compile to finish reduce(create, orOp<bool>()); }
void Foam::codedFixedValueFvPatchField<Type>::createLibrary ( dynamicCode& dynCode, const dynamicCodeContext& context ) const { bool create = Pstream::master(); if (create) { // Write files for new library if (!dynCode.upToDate(context)) { // filter with this context dynCode.reset(context); // take no chances - typeName must be identical to redirectType_ dynCode.setFilterVariable("typeName", redirectType_); // set TemplateType and FieldType filter variables // (for fvPatchField) setFieldTemplates(dynCode); // compile filtered C template dynCode.addCompileFile(codeTemplateC); // copy filtered H template dynCode.addCopyFile(codeTemplateH); // debugging: make BC verbose // dynCode.setFilterVariable("verbose", "true"); // Info<<"compile " << redirectType_ << " sha1: " // << context.sha1() << endl; // define Make/options dynCode.setMakeOptions ( "EXE_INC = -g \\\n" "-I$(LIB_SRC)/finiteVolume/lnInclude \\\n" + context.options() + "\n\nLIB_LIBS = \\\n" + " -lOpenFOAM \\\n" + " -lfiniteVolume \\\n" + context.libs() ); if (!dynCode.copyOrCreateFiles(true)) { FatalIOErrorIn ( "codedFixedValueFvPatchField<Type>::createLibrary(..)", context.dict() ) << "Failed writing files for" << nl << dynCode.libRelPath() << nl << exit(FatalIOError); } } if (!dynCode.wmakeLibso()) { FatalIOErrorIn ( "codedFixedValueFvPatchField<Type>::createLibrary(..)", context.dict() ) << "Failed wmake " << dynCode.libRelPath() << nl << exit(FatalIOError); } } // all processes must wait for compile to finish reduce(create, orOp<bool>()); }