/***********************************************************************
*
* ELMER, A Computational Fluid Dynamics Program.
*
* Copyright 1st April 1995 - , Center for Scientific Computing,
* Finland.
*
* All rights reserved. No part of this program may be used,
* reproduced or transmitted in any form or by any means
* without the written permission of CSC.
*
* Address: Center for Scientific Computing
* Tietotie 6, P.O. BOX 405
* 02101 Espoo, Finland
* Tel. +358 0 457 2001
* Telefax: +358 0 457 2302
* EMail: Jari.Jarvinen@csc.fi
************************************************************************/
/***********************************************************************
Program: ELMER Front
Module: ecif_inputEmf.cpp
Language: C++
Date: 20.10.98
Version: 1.00
Author(s): Martti Verho
Revisions:
Abstract: Implementation (read Elmer model files (.emf files)
************************************************************************/
#include "ecif_body2D.h"
#include "ecif_body3D.h"
#include "ecif_bodyElement.h"
#include "ecif_control.h"
#include "ecif_geometry.h"
#include "ecif_inputEmf.h"
#include "ecif_model.h"
#include "ecif_model_aux.h"
#include "ecif_parameter.h"
#include "ecif_userinterface.h"
#include "ecif_timer.h"
extern char read_buffer[];
extern bool IS_FATAL;
extern bool NOT_FATAL;
const int isOk = emf_OK;
const int notOk = emf_ERROR;
static int int_buffer[10000];
template <class T> ostream&
output_array(ostream& out, UserInterface* gui, int length, T* array)
{
ostrstream strm;
for (int i = 0; i < length; i++) {
strm << array[i];
}
strm << ends;
gui->showMsg(strm.str());
return out;
}
struct ParamCopyData {
bool add_to_model;
ParameterList paramList;
};
InputEmf::InputEmf(enum ecif_modelDimension m_dim,
ifstream& in_file, char* in_filename):
InputFront(m_dim, in_file, in_filename)
{
isChecked = true;
isEmfInput = true;
}
void
InputEmf::copyEmfParameters()
{
UserInterface* gui = theControlCenter->getGui();
char objSep = '!';
char fldSep = '&';
int i;
struct emf_ObjectData_X my_ObjectData;
emf_ObjectData = &my_ObjectData;
// Set callback functions
emf_readDataCB = copyEmfParametersCallBack;
emf_readMessageCB = readEmfGeometryMsgCallBack;
/*-----Start parser*/
ParamCopyData cpd;
char msg_buffer[256];
cpd.add_to_model = false;
int rc = emf_readData(infileName, (void**)&cpd, 255, msg_buffer, 0);
// Parameters which were read from input
//
int nof_params = cpd.paramList.size();
ParameterList::iterator itr = cpd.paramList.begin();
// Send list of parameters data to Gui to be finally selected
// by the user
strstream pdatas;
for (i = 0; i < nof_params; i++, itr++) {
Parameter* param = *itr;
//pdatas << param->getName() << fldSep;
// Ok, we do not add any extra info
pdatas << param->getEmfName() << ": ";
pdatas << param->getName();
#if 0
// Possible correspondig parent object from the current model
// NOTE: Matching objects within different models would be so
// messy that we do not even try it, so no further data is added!!
//Emf-file object
objectType etp = param->getParentEmfType();
const char* enm = model->objectType2Name(etp);
int etg = param->getParentEmfTag();
pdatas << enm << fldSep;
pdatas << etg << fldSep;
// Current model object
ModelObject* obj = model->getModelObjectByTag(etp, etg);
if ( obj != NULL ) {
objectType otp = obj->getObjectType();
const char* onm = model->objectType2Name(otp);
int otg = obj->Tag();
pdatas << onm << fldSep;
pdatas << otg << fldSep;
} else {
pdatas << "";
pdatas << NO_INDEX;
}
#endif
if ( i < nof_params - 1 ) {
pdatas << objSep;
}
}
pdatas << ends;
bool* accept_flags = new bool[nof_params];
// Ask the user to select parameters to be copied
//
gui->acceptEmfParameters("Select parameters to copy", nof_params, pdatas.str(), accept_flags);
// Copy selected parametrs
//
itr = cpd.paramList.begin();
int count = 0;
for (i = 0; i < nof_params; i++, itr++) {
Parameter* param = *itr;
if ( !accept_flags[i] ) {
delete param;
continue;
}
count = count + 1;
// Set correct ids for the copied parameter
//
int lid = param->getLastId();
param->setId(1+lid);
param->setLastId(1+lid);
param->setParentId(NO_INDEX);
param->setParentEmfTag(NO_INDEX);
param->setParentEmfType(OT_NONE);
param->setSubParentEmfTag(NO_INDEX);
param->setSubParentEmfType(OT_NONE);
// Select a non-existing name for the paramter to be copied
// Contrain1 Constrain1-c Contraint1-c-c ...
//
while ( model->modelHasParameter(param->getParameterType(), param->getName()) ) {
strstream strm;
strm << param->getName() << "-c" << ends;
param->setName(strm.str());
}
// Add parameter
model->addParameter(param->getParameterType(), param);
}
delete[] accept_flags;
// Info message and update the model data in gui
if ( count > 0 ) {
strstream strm;
strm << "Parameters copied: " << count << ends;
gui->showMsg(strm.str());
gui->updateParameterDataPre(model);
gui->updateParameterDataPost(model);
}
return;
}
// This method gets one "field" at a time from the file
//
// NOTE: Only those parameter which can have multiple intances
// can be copied
// NOTE: Equations cannot be copied, because they may need
// an EquationVariables-parameter which a single instance creature
//
int
InputEmf::copyEmfParametersCallBack(void** user_data)
{
UserInterface* gui = theControlCenter->getGui();
ParamCopyData* cpd = (ParamCopyData*)user_data;
// Global object pointing to the record, make
// a short hand for it
emf_ObjectData_X* od = emf_ObjectData;
const char* on = od->object_name;
int onl = od->object_name_length;
const char* fn = od->field_name;
int fnl = od->field_name_length;
const char* dt = od->data_type;
int dtl = od->data_type_length;
const Parameter* param = NULL;
bool add_to_model = false;
// Read data according to the object type
// Parameters
// ==========
int rc;
//-Body Force
if ( LibFront::in(EMF_BODY_FORCE, on) ) {
rc = readEmfParameter(od, ECIF_BODY_FORCE, param, add_to_model);
}
//-Body Parameter
else if ( LibFront::in(EMF_BODY_PARAMETER, on) ) {
rc = readEmfParameter(od, ECIF_BODY_PARAMETER, param, add_to_model);
}
//-Boundary condition
else if ( LibFront::in(EMF_BOUNDARY_CONDITION, on) ) {
rc = readEmfParameter(od, ECIF_BOUNDARY_CONDITION, param, add_to_model);
}
//-Boundary Parameter
else if ( LibFront::in(EMF_BOUNDARY_PARAMETER, on) ) {
rc = readEmfParameter(od, ECIF_BOUNDARY_PARAMETER, param, add_to_model);
}
//-Calculator solver
else if ( LibFront::in(EMF_CALCULATOR, on) ) {
rc = readEmfParameter(od, ECIF_CALCULATOR, param, add_to_model);
}
//-Physical Constant
else if ( LibFront::in(EMF_CONSTANT, on) || LibFront::in("Constants", on) ) {
//rc = readEmfParameter(od, ECIF_CONSTANT, param, add_to_model);
}
//-Coordinate
else if ( LibFront::in(EMF_COORDINATE, on) || LibFront::in("Coordinates", on) ) {
//rc = readEmfParameter(od, ECIF_COORDINATE, param, add_to_model);
}
//-Equation
else if ( LibFront::in(EMF_EQUATION, on) ) {
//rc = readEmfParameter(od, ECIF_EQUATION, param, add_to_model);
}
//-EquationVariables
else if ( LibFront::in(EMF_EQUATION_VARIABLE, on) || LibFront::in("Equation Variables", on) ) {
//rc = readEmfParameter(od, ECIF_EQUATION_VARIABLE, param, add_to_model);
}
//-Grid H parameter
else if ( LibFront::in(EMF_GRID_H, on) || LibFront::in("GridH", on) ) {
rc = readEmfParameter(od, ECIF_GRID_H, param, add_to_model);
}
//-Grid parameter
else if ( LibFront::in(EMF_GRID_PARAMETER, on) ||
LibFront::in("Mesh Parameter", on)
) {
rc = readEmfParameter(od, ECIF_GRID_PARAMETER, param, add_to_model);
}
//-Initial condition
else if ( LibFront::in(EMF_INITIAL_CONDITION, on) ) {
rc = readEmfParameter(od, ECIF_INITIAL_CONDITION, param, add_to_model);
}
//-Material
else if ( LibFront::in(EMF_MATERIAL, on) ) {
rc = readEmfParameter(od, ECIF_MATERIAL, param, add_to_model);
}
//-Model parameter
else if ( LibFront::in(EMF_MODEL_PARAMETER, on) ) {
rc = readEmfParameter(od, ECIF_MODEL_PARAMETER, param, add_to_model);
}
//-Simulation parameter
else if ( LibFront::in(EMF_SIMULATION_PARAMETER, on) ) {
rc = readEmfParameter(od, ECIF_SIMULATION_PARAMETER, param, add_to_model);
}
//-Solver
else if ( LibFront::in(EMF_SOLVER, on) ) {
//rc = readEmfParameter(od, ECIF_SOLVER, param, add_to_model);
}
//-SolverControl parameter
else if ( LibFront::in(EMF_SOLVER_CONTROL, on) ) {
//rc = readEmfParameter(od, ECIF_SOLVER_CONTROL, param, add_to_model);
}
//-Timestep
else if ( LibFront::in(EMF_TIMESTEP, on) ) {
rc = readEmfParameter(od, ECIF_TIMESTEP, param, add_to_model);
}
//-User settings
else if ( LibFront::in(EMF_USER_SETTING, on) || LibFront::in("User Settings", on) ) {
//rc = readEmfParameter(od, ECIF_USER_SETTING, param, add_to_model);
}
//-UNKNOWN object
else {
//return unknownObjectMsg(od, false);
}
if ( param != NULL ) {
const char* pd = ((Parameter*)param)->getValue();
if ( pd != NULL && pd[0] != '\0' && pd != "" ) {
cpd->paramList.push_back((Parameter*)param);
}
}
return isOk;
}
// Main function for the file reading
bool
InputEmf::readCadGeometry()
{
struct emf_ObjectData_X my_ObjectData;
emf_ObjectData = &my_ObjectData;
// Set callback functions
//int my_readDataCB(void**);
emf_readDataCB = readEmfGeometryCallBack;
emf_readMessageCB = readEmfGeometryMsgCallBack;
InputEmf* ci = this;
char msg_buffer[256];
// Start parser by calling the interface function
int rc = emf_readData(infileName, (void**)&ci, 255, msg_buffer, 0);
if (rc != 0) {
modelDimension = ECIF_ND;
return false;
}
// Convert tags to ids
model->convertTags2Ids();
return true;
}
int
InputEmf::readEmfGeometryMsgCallBack(char* msg_buffer)
{
UserInterface* gui = theControlCenter->getGui();
return gui->showMsg(msg_buffer, 0, true);
}
// This method gets one "field" at a time from the file
int
InputEmf::readEmfGeometryCallBack(void** user_data)
{
UserInterface* gui = theControlCenter->getGui();
InputEmf* emfIn = (InputEmf*)*user_data;
InputFront* frontIn = (InputFront*)*user_data;
// Global object pointing to the record, make
// a short hand for it
emf_ObjectData_X* od = emf_ObjectData;
const Parameter* param;
const char* on = od->object_name;
int onl = od->object_name_length;
const char* fn = od->field_name;
int fnl = od->field_name_length;
const char* dt = od->data_type;
int dtl = od->data_type_length;
// Read data according to the object type
// Geometry related
// ================
//-Body
if ( LibFront::in(EMF_BODY, on) ) {
return readBody(od);
}
//-Element group
else if ( LibFront::in(EMF_ELEMENT_GROUP, on) ) {
return readElementGroup(od);
}
//-Body element (inputVersionNbr <= 4 style!)
else if ( LibFront::in("Element", on) ) {
if ( model->getDimension() ==ECIF_2D )
return readEdge(od);
else
return readFace(od);
}
//-Vertex (inputVersionNbr >= 5 style!)
else if ( LibFront::in(EMF_VERTEX, on) ) {
return readVertex(od);
}
//-Edge (inputVersionNbr >= 5 style!)
else if ( LibFront::in(EMF_EDGE, on) ) {
return readEdge(od);
}
//-Face (inputVersionNbr >= 5 style!)
else if ( LibFront::in(EMF_FACE, on) ) {
return readFace(od);
}
//-Element loop
else if ( LibFront::in(EMF_ELEMENT_LOOP, on) ) {
return readElementLoop(od);
}
//-Inner boundaries (pre version 5 stuff!)
else if ( LibFront::in("Inner Boundaries", on) ) {
return isOk;
}
//-Outer boundaries (pre version 5 stuff!)
else if ( LibFront::in("Outer Boundaries", on) ) {
return isOk;
}
//-Boundary vertices table (pre version 5 stuff!)
else if ( LibFront::in("Boundary Vertices", on) ) {
//return readFrontBoundaryVertices(emfIn, od);
}
//-Vertex table (version 9 -->)
else if ( LibFront::in(EMF_VERTICES, on) ||
LibFront::in(EMF_VERTEX_TABLE, on)
) {
return readVertexTable(od);
}
// Parameters
// ==========
//-Body Force
else if ( LibFront::in(EMF_BODY_FORCE, on) ) {
return readEmfParameter((emf_ObjectData_X*)od, ECIF_BODY_FORCE, param, true);
}
//-Body Parameter
else if ( LibFront::in(EMF_BODY_PARAMETER, on) ) {
return readEmfParameter(od, ECIF_BODY_PARAMETER, param, true);
}
//-Boundary condition
else if ( LibFront::in(EMF_BOUNDARY_CONDITION, on) ) {
return readEmfParameter(od, ECIF_BOUNDARY_CONDITION, param, true);
}
//-Boundary Parameter
else if ( LibFront::in(EMF_BOUNDARY_PARAMETER, on) ) {
return readEmfParameter(od, ECIF_BOUNDARY_PARAMETER, param, true);
}
//-Calculator solver
else if ( LibFront::in(EMF_CALCULATOR, on) ) {
return readEmfParameter(od, ECIF_CALCULATOR, param, true);
}
//-Physical Constant
else if ( LibFront::in(EMF_CONSTANT, on) || LibFront::in("Constants", on) ) {
return readEmfParameter(od, ECIF_CONSTANT, param, true);
}
//-Coordinate
else if ( LibFront::in(EMF_COORDINATE, on) || LibFront::in("Coordinates", on) ) {
return readEmfParameter(od, ECIF_COORDINATE, param, true);
}
//-Datafile
else if ( LibFront::in(EMF_DATAFILE, on) || LibFront::in("Datafiles", on) ) {
return readEmfParameter(od, ECIF_DATAFILE, param, true);
}
//-Equation
else if ( LibFront::in(EMF_EQUATION, on) ) {
return readEmfParameter(od, ECIF_EQUATION, param, true);
}
//-EquationVariables
else if ( LibFront::in(EMF_EQUATION_VARIABLE, on) || LibFront::in("Equation Variables", on) ) {
return readEmfParameter(od, ECIF_EQUATION_VARIABLE, param, true);
}
//-Header
else if ( LibFront::in(EMF_HEADER, on) ) {
return readEmfHeader(emfIn, od);
}
//-Grid H parameter
else if ( LibFront::in(EMF_GRID_H, on) || LibFront::in("GridH", on) ) {
return readEmfParameter(od, ECIF_GRID_H, param, true);
}
//-Grid parameter
else if ( LibFront::in(EMF_GRID_PARAMETER, on) ||
LibFront::in("Mesh Parameter", on)
) {
return readEmfParameter(od, ECIF_GRID_PARAMETER, param, true);
}
//-Initial condition
else if ( LibFront::in(EMF_INITIAL_CONDITION, on) ) {
return readEmfParameter(od, ECIF_INITIAL_CONDITION, param, true);
}
//-Material
else if ( LibFront::in(EMF_MATERIAL, on) ) {
return readEmfParameter(od, ECIF_MATERIAL, param, true);
}
//-Model parameter
else if ( LibFront::in(EMF_MODEL_PARAMETER, on) ) {
return readEmfParameter(od, ECIF_MODEL_PARAMETER, param, true);
}
//-Simulation parameter
else if ( LibFront::in(EMF_SIMULATION_PARAMETER, on) ) {
return readEmfParameter(od, ECIF_SIMULATION_PARAMETER, param, true);
}
//-Solver
else if ( LibFront::in(EMF_SOLVER, on) ) {
return readEmfParameter(od, ECIF_SOLVER, param, true);
}
//-SolverControl parameter
else if ( LibFront::in(EMF_SOLVER_CONTROL, on) ) {
return readEmfParameter(od, ECIF_SOLVER_CONTROL, param, true);
}
//-Model statistics (not read actually!!!)
else if ( LibFront::in(EMF_STATISTICS, on) ) {
return isOk;
}
//-Update timestamps
else if ( LibFront::in(EMF_TIMESTAMPS, on) ) {
return readEmfTimestamps(od);
}
//-Timestep
else if ( LibFront::in(EMF_TIMESTEP, on) ) {
return readEmfParameter(od, ECIF_TIMESTEP, param, true);
}
//-User settings
else if ( LibFront::in(EMF_USER_SETTING, on) || LibFront::in("User Settings", on) ) {
return readEmfParameter(od, ECIF_USER_SETTING, param, true);
}
//-UNKNOWN object
else {
return unknownObjectMsg(od, false);
}
return isOk;
}
// This method gets one field at a time for the header
int
InputEmf::readEmfHeader(InputEmf* emfIn, emf_ObjectData_X* od)
{
UserInterface* gui = theControlCenter->getGui();
const char* fn = od->field_name;
ModelInfo* mi = (ModelInfo*) model->getModelInfo();
ParallelInfo* pi = (ParallelInfo*) model->getParallelInfo();
//-Geometry edited flag for bodies
if ( LibFront::in(EMF_BODY_GEOMETRY_EDITED, fn) ) {
model->setFlagValue(GEOMETRY_EDITED, GEOMETRY_EDITED_BODIES, true);
}
//-Geometry edited flag for boundaries
else if ( LibFront::in(EMF_BOUNDARY_GEOMETRY_EDITED, fn) ) {
model->setFlagValue(GEOMETRY_EDITED, GEOMETRY_EDITED_BOUNDARIES, true);
}
//-Created string
else if ( LibFront::in(EMF_CREATED, fn) ) {
update_dyna_string(mi->created, (char*)od->data);
}
//-Modified string
else if ( LibFront::in(EMF_MODIFIED, fn) ) {
update_dyna_string(mi->modified, (char*)od->data);
}
//-User defined fields flag
else if ( LibFront::in(EMF_HAS_USER_DEFINITIONS, fn) ) {
mi->hasUserDefinitions = true;
}
//-Cad source file
else if ( LibFront::in(EMF_CAD_SOURCE_FILE, fn) ) {
update_dyna_string(mi->cadSourceFile, (char*)od->data);
}
//-Model geometry dimension
else if ( LibFront::in(EMF_DIMENSION, fn) ) {
int target;
LibFront::setNumericData(target, 0);
mi->dimension = (ecif_modelDimension)target;
emfIn->modelDimension = mi->dimension;
}
//-Elmer Front emf-file format original source version (scalar 1 -->)
else if ( LibFront::in(EMF_ELMER_FRONT_INPUT_VERSION, fn) ) {
LibFront::setNumericData(mi->frontPreviousInputVersionNbr, 0);
}
//-Elmer Front emf-file format version (scalar 1 -->)
else if ( LibFront::in(EMF_ELMER_FRONT_VERSION, fn) ) {
LibFront::setNumericData(mi->frontInputVersionNbr, 0);
}
//-Emf Matc input file
else if ( LibFront::in(EMF_MATC_FILE_EMF, fn) ) {
char* filename = NULL;
readName(od, filename);
if ( filename != NULL && filename[0] != '\0' ) {
model->readMatcFile(filename, "for emf-file", false);
model->setMatcInputFileEmf(filename);
}
delete[] filename;
}
//-Sif Matc input file
else if ( LibFront::in(EMF_MATC_FILE_SIF, fn) ) {
char* filename = NULL;
readName(od, filename);
if ( filename != NULL && filename[0] != '\0' ) {
model->readMatcFile(filename, "for sif-file", false);
model->setMatcInputFileSif(filename);
}
delete[] filename;
}
//-Include path (if saved in model file)
else if ( LibFront::in(EMF_INCLUDE_PATH, fn) ) {
update_dyna_string(mi->includePath, (char*)od->data);
}
//-Log files directory (if saved in model file)
else if ( LibFront::in(EMF_LOG_DIRECTORY, fn) ) {
update_dyna_string(mi->temporaryFilesDirectory, (char*)od->data);
}
//-Mesh name (inputVerionNbr <=4 )
else if ( LibFront::in("Mesh Name", fn) ) {
int nof_meshes = 1; // only one string
char** mesh_names = NULL;
LibFront::setStringData(nof_meshes, mesh_names);
model->setMeshNames(nof_meshes, mesh_names);
for (int i = 0; i < nof_meshes; i++) {
delete[] mesh_names[i];
}
delete[] mesh_names;
}
//-Mesh names (inputVerionNbr >= 5 )
else if ( LibFront::in(EMF_MESH_NAMES, fn) ) {
int nof_meshes = od->dimension1; // list of strings
char** mesh_names = NULL;
LibFront::setStringData(nof_meshes, mesh_names);
model->setMeshNames(nof_meshes, mesh_names);
for (int i = 0; i < nof_meshes; i++) {
delete[] mesh_names[i];
}
delete[] mesh_names;
}
//-Current mesh index (inputVerionNbr >= 5)
else if ( LibFront::in(EMF_CURRENT_MESH_INDEX, fn) ) {
int mesh_index;
LibFront::setNumericData(mesh_index, 0);
model->setCurrentMeshIndex(mesh_index);
}
//-Model level meshFs
else if ( LibFront::in(EMF_MESH_F, fn) ) {
int size = od->data_length;
double* mesh_f = new double[size];
for (int i = 0; i < size; i++)
LibFront::setNumericData(mesh_f[i], i);
model->setMeshFs(size, mesh_f);
delete[] mesh_f;
}
//-Model level meshHs
else if ( LibFront::in(EMF_MESH_H, fn) ) {
int size = od->data_length;
double* mesh_h = new double[size];
for (int i = 0; i < size; i++)
LibFront::setNumericData(mesh_h[i], i);
model->setMeshHs(size, mesh_h);
delete[] mesh_h;
}
else if ( LibFront::in(EMF_MESH_BG_MESH_FILE_INDICES, fn) ) {
int size = od->data_length;
int* bg_mesh_file_indices = new int[size];
for (int i = 0; i < size; i++)
LibFront::setNumericData(bg_mesh_file_indices[i], i);
model->setMeshBgMeshFileIndices(size, bg_mesh_file_indices);
delete[] bg_mesh_file_indices;
}
else if ( LibFront::in(EMF_MESH_BG_MESH_FILES, fn) ) {
int size = od->dimension1; // list of strings
char** bg_files = NULL;
LibFront::setStringData(size, bg_files);
model->setMeshBgMeshFiles(size, bg_files);
for (int i = 0; i < size; i++) {
if ( bg_files [i] != NULL ) {
delete[] bg_files[i];
}
}
delete[] bg_files;
}
//-Bg mesh active indicators
else if ( LibFront::in(EMF_MESH_BG_MESH_ACTIVES, fn) ) {
int size = od->data_length;
int* bg_act = new int[size];
for (int i = 0; i < size; i++)
LibFront::setNumericData(bg_act[i], i);
model->setMeshBgMeshActives(size, bg_act);
delete[] bg_act;
}
//-Bg mesh control file indicators
else if ( LibFront::in(EMF_MESH_BG_MESH_CONTROLS, fn) ) {
int size = od->data_length;
int* bg_ctrl = new int[size];
for (int i = 0; i < size; i++)
LibFront::setNumericData(bg_ctrl[i], i);
model->setMeshBgMeshControls(size, bg_ctrl);
delete[] bg_ctrl;
}
//-Model level grid parameter id
else if ( LibFront::in(EMF_GRID_PARAMETER, fn) ) {
// Do nothing!
//LibFront::setNumericData(mi->gridParamId, 0);
//model->setGridParamId(mi->gridParamId);
}
//-Mesh result file
else if ( LibFront::in(EMF_MESH_RESULT_FILE, fn) ) {
update_dyna_string(mi->meshResultFile, (char*)od->data);
}
//-Mesh source file
else if ( LibFront::in(EMF_MESH_SOURCE_FILE, fn) ) {
update_dyna_string(mi->meshSourceFile, (char*)od->data);
}
//-Minimum edge size
else if ( LibFront::in(EMF_MINIMUM_EDGE_SIZE, fn) ) {
LibFront::setNumericData(mi->minEdgeSize, 0);
}
//-Model description
else if ( LibFront::in(EMF_MODEL_DESCRIPTION, fn) ) {
update_dyna_string(mi->modelDescription, (char*)od->data);
}
//-Model name
else if ( LibFront::in(EMF_MODEL_NAME, fn) ) {
update_dyna_string(mi->modelName, (char*)od->data);
}
//-Model source type (cad/mesh/both)
else if ( LibFront::in(EMF_MODEL_SOURCE_TYPE, fn) ) {
int target;
LibFront::setNumericData(target, 0);
mi->modelSourceType = (ecif_modelSource)target;
mi->updateGeometryType();
}
//-Model status
else if ( LibFront::in(EMF_MODEL_STATUS, fn) ) {
LibFront::setNumericData(mi->modelStatus, 0);
}
//-Nof processors (parallel info)
else if ( LibFront::in(EMF_NOF_PROCESSORS, fn) ) {
LibFront::setNumericData(pi->nofProcessors, 0);
}
//-problem description
else if ( LibFront::in(EMF_PROBLEM_DESCRIPTION, fn) ) {
update_dyna_string(mi->problemDescription, (char*)od->data);
}
//-Model name
else if ( LibFront::in(EMF_PROBLEM_NAME, fn) ) {
update_dyna_string(mi->problemName, (char*)od->data);
}
//-Output files directory (if saved in model file)
else if ( LibFront::in(EMF_RESULTS_DIRECTORY, fn) ) {
update_dyna_string(mi->resultsDirectory, (char*)od->data);
}
//-Modelfile timestamp
else if ( LibFront::in(EMF_TIMESTAMP, fn) ) {
update_dyna_string(mi->modelFileTs, (char*)od->data);
}
//-Unknown field
else {
return unknownFieldMsg(od, false);
}
return isOk;
}
// Read one field for a active parameter
int
InputEmf::readEmfParameter(emf_ObjectData_X* od,
ecif_parameterType parameter_type,
const Parameter*& param,
bool add_to_model)
{
ModelInfo* mi = (ModelInfo*) model->getModelInfo();
// This stores data during multiple calls
static Parameter* parameter = NULL;
UserInterface* gui = theControlCenter->getGui();
const char* fn = od->field_name;
int parent_tag;
int sub_parent_tag;
int parent_type;
// Nothing for the reference argument yet!
//
param = NULL;
// New parameter started
if (od->is_object_start) {
// Create parameter
// NOTE: NO_INDEX parameter id prevents the last_id class
// variable being updated, it should be update only when
// a parameter is really added to the model
//
if ( add_to_model ) {
parameter = model->createNewParameter(parameter_type, od->object_id);
} else {
parameter = model->createNewParameter(parameter_type, NO_INDEX);
}
if (parameter == NULL)
return 1;
if ( add_to_model ) {
model->addParameter(parameter_type, parameter);
}
}
// Parse fields
// ============
//-Parent tag for which parameter was created (version 9-)
// "Parent Object" for versions 5-8
if ( LibFront::in(EMF_PARENT, fn) ||
LibFront::in("Parent Object", fn)
) {
LibFront::setNumericData(parent_tag, 0);
parameter->setParentEmfTag(parent_tag);
}
//-Sub parent tag for which parameter was created (version 9-)
// Like body-layer for grid parameter
if ( LibFront::in(EMF_SUB_PARENT, fn) ) {
LibFront::setNumericData(sub_parent_tag, 0);
parameter->setSubParentEmfTag(sub_parent_tag);
}
//-Object type for which parameter was created (versions 9-)
// "Parent Object Type" for versions 5-8
else if ( LibFront::in(EMF_PARENT_TYPE, fn) ||
LibFront::in("Parent Object Type", fn)
) {
// Object type code (enumrated number like OT_EDGE)
if ( mi->frontInputVersionNbr < 7 ) {
LibFront::setNumericData(parent_type, 0);
parameter->setParentEmfType((objectType)parent_type);
// Object type name (like "Edge")
} else {
parameter->setParentEmfType( model->objectName2Type((char*)od->data) );
}
}
//-Body1 (version 4)
else if ( LibFront::in("Body1", fn) ) {
LibFront::setNumericData(parent_tag, 0);
parameter->setParentEmfTag(parent_tag);
parameter->setParentEmfType(OT_BODY);
}
//-Body2 (version 4)
else if ( LibFront::in("Body2", fn) ) {
}
//-Name
else if ( LibFront::in(EMF_NAME, fn) ) {
parameter->setName((char*) od->data);
}
//-Apply count (not in use!)
else if ( LibFront::in("Apply Count", fn) ) {
}
//-Attach mode (not in use!)
else if ( LibFront::in("Attach Mode", fn) ) {
}
//-Data (as string!)
else if ( LibFront::in(EMF_DATA, fn) ) {
parameter->setValue((char*) od->data);
}
//-Mask (is in use!)
else if ( LibFront::in("Mask", fn) ) {
}
//-Unknown field
else {
// We accept here anything, because parameters
// fields could come as fields!!!
//return unknownFieldMsg(od, false);
}
// Parameter at end, store pointer to the reference argument
//
if (od->is_object_end) {
param = parameter;
}
return isOk;
}
// This method gets one field for the Tisestamps data
int
InputEmf::readEmfTimestamps(emf_ObjectData_X* od)
{
UserInterface* gui = theControlCenter->getGui();
const char* fn = od->field_name;
ModelInfo* mi = (ModelInfo*) model->getModelInfo();
//-Elmer Front data itself
if ( LibFront::in(EMF_TS_FRONT, fn) ) {
update_dyna_string(mi->databaseTs, (char*) od->data);
}
//-Elmer Database
else if ( LibFront::in(EMF_TS_DATABASE, fn) ) {
update_dyna_string(mi->databaseTs, (char*) od->data);
}
//-Elmer Mesh Parameter
else if ( LibFront::in("Grid Parameter", fn) ) {
update_dyna_string(mi->meshParameterTs, (char*) od->data);
}
//-Elmer Mesh generator
else if ( LibFront::in(EMF_TS_MESH, fn) ) {
update_dyna_string(mi->meshTs, (char*) od->data);
}
//-Elmer Solver
else if ( LibFront::in(EMF_TS_SOLVER, fn) ) {
update_dyna_string(mi->solverTs, (char*) od->data);
}
//-Elmer Gebhardt Factors
else if ( LibFront::in(EMF_TS_GEBHARDT_FACTORS, fn) ||
LibFront::in("GebhardtFactors", fn)
) {
update_dyna_string(mi->gebhardtFactorsTs, (char*) od->data);
}
//-Elmer View Factors
else if ( LibFront::in(EMF_TS_VIEW_FACTORS, fn) ||
LibFront::in("ViewFactors", fn)
) {
update_dyna_string(mi->viewfactorsTs, (char*) od->data);
}
//-Unknown field
else {
return unknownFieldMsg(od, false);
}
return isOk;
}
syntax highlighted by Code2HTML, v. 0.9.1