Commit f572ccbf authored by Arkadiy Marinenko's avatar Arkadiy Marinenko

правила создания библиотеки gcdfes, использующей библиотеку comsdk (4-5 этапы)

parent 917fef78
......@@ -10,4 +10,11 @@
В данной версии nla3d улучшен алгоритм вывода данных для VTK-файлов. Скорость вывода увеличена в разы, особенно хорошо это заметно на больших сетках.
Для успешной компиляции необходимо наличие исходников библиотеки линейной алгебры eigen.
В ходе компиляции будет большое количество warning'ов, это нормально и связано с eigen.
4. С помощью CMAKE откомпилировать библиотеку comsdk (https://sa2systems.ru:881/com/comsdk).
5. Создать проект библиотеки gcdfes, состоящий из четырёх файлов - gcdfes.cpp (https://sa2systems.ru:881/gcd/gcdfes/blob/master/dev/gcdfes.cpp), gcdfes.h (https://sa2systems.ru:881/gcd/gcdfes/blob/master/dev/gcdfes.h) и FEReaders.cpp/FEReaders.h (внутри папки libgcdfes).
При создании библиотеки указать, какие решатели будем использовать - paralution (-DNLA3D_USE_PARALUTION), mkl (-DNLA3D_USE_MKL) или оба сразу.
Пример использования решателей mkl внутри кода: math::PARDISO_equationSolver eqSolver = math::PARDISO_equationSolver();
Пример использования решателей paralution внутри кода: math::PARALUTION_equationSolver eqSolver = math::PARALUTION_equationSolver();
При создании библиотеки gcdfes для линковщика подключить следующие библиотеки в следующем порядке (для варианта, когда используются как решатели mkl, так и решатели paralution): -lcomsdk -lnla3d -lmath -lparalution -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl -lboost_system
Пример проекта CodeBlocks (libgcdfes.cbp) и make-файла находятся в папке libgcdfes (для корректной работы нужно добавить два файла - gcdfes.cpp и gcdfes.h).
This diff is collapsed.
// This file is a part of nla3d project. For information about authors and
// licensing go to project's repository on github:
// https://github.com/dmitryikh/nla3d
#pragma once
#include <vector>
#include <set>
#include <string>
#include <iostream>
#include <algorithm>
#include <regex>
#include "sys.h"
#include "Node.h"
#include "elements/element.h"
#include "FEStorage.h"
#include "FESolver.h"
using namespace nla3d;
// neutral data structure to keep FE data.
class MeshData {
public:
std::vector<uint32> cellNumbers;
std::vector<std::vector<uint32>> cellNodes;
// custom element data of different types
// NOTE: every element in MeshData should have the same set of custom data
std::map<std::string, std::vector<double>> cellDoubleData;
std::map<std::string, std::vector<uint32>> cellIntData;
std::map<std::string, std::vector<string>> cellStringData;
std::vector<uint32> nodesNumbers;
std::vector<Vec<3>> nodesPos;
std::vector<loadBC> loadBcs;
std::vector<fixBC> fixBcs;
std::vector<Mpc*> mpcs;
std::map<std::string, FEComponent> feComps;
void clear();
// compress node numbers, we don't compress element numbers because FEStorage will renumber
// elements anyway
void compressNumbers();
// delete nodes which don't belong to any element
// void deleteOrphanNodes();
// cell is degenerated when some it's nodes have the same numbers
std::vector<uint32> getDegeneratedCells();
std::vector<uint32> getCellsByAttribute(std::string atr_name, uint32 atr_val);
private:
};
std::string& strim(std::string& str);
// std::move semantic to use with rvalues
std::string&& strim(std::string&& str);
// return first non-space char
char sfirstNotBlank(const string& str);
std::string& stolower(std::string& str);
std::string& stoupper(std::string& str);
// split `line` to substrings with `widths` lengths, if `strict` is false then last substrings could
// be missed
std::vector<std::string> ssplit(const std::string& line, const std::vector<int>& widths,
bool strict = true);
// case insensitive string comparison
bool iequals(const string& a, const string& b);
// get line from the `is`, supported all types of line endings
std::istream& getLine(std::istream& is, std::string& t);
// class to split line into substrings with delimiters.
class Tokenizer {
public:
int tokenize(const std::string& line);
int tokenInt(size_t ind);
double tokenDouble(size_t ind);
std::string& getTokenString(size_t ind);
std::set<char> delimiters;
std::vector<std::string> tokens;
std::vector<char> dtokens;
bool tolower = false;
};
// read Ansys Mechanical APDL *.cdb file. Nodes, Elements, Displacement BC, Force BC and MPC
// (Constraint equations) is supported
bool readCdbFile(std::string filename, MeshData& md);
// read netgen neutral volume mesh format *.neu file.
bool readNeuFile(std::string filename, MeshData& md);
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="libgcdfes" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/gcdfes" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Debug/" />
<Option type="3" />
<Option compiler="gcc" />
<Option createDefFile="1" />
<Option createStaticLib="1" />
<Compiler>
<Add option="-m64" />
<Add option="-g" />
<Add option="-fPIC" />
<Add option="-DNLA3D_USE_MKL" />
<Add option="-DNLA3D_USE_PARALUTION" />
<Add directory="../../cuda_nla3d" />
<Add directory="../comsdk/dev" />
<Add directory="../easylogging" />
<Add directory="../math" />
<Add directory="../nla3d" />
<Add directory="/opt/intel/mkl/include" />
<Add directory="/usr/include/eigen3" />
<Add directory="../libgcdfes" />
</Compiler>
<Linker>
<Add option="-m64" />
<Add option="-lcomsdk" />
<Add option="-lnla3d" />
<Add option="-lmath" />
<Add option="-lparalution" />
<Add option="-lmkl_intel_lp64" />
<Add option="-lmkl_sequential" />
<Add option="-lmkl_core" />
<Add option="-lpthread" />
<Add option="-lm" />
<Add option="-ldl" />
<Add option="-lboost_system" />
<Add directory="../comsdk/rls" />
<Add directory="../math/bin/Debug" />
<Add directory="../nla3d/bin/Debug" />
<Add directory="../paralution-1.1.0/build/lib" />
<Add directory="/opt/intel/mkl/lib/intel64" />
</Linker>
</Target>
<Target title="Release">
<Option output="bin/Release/gcdfes" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Release/" />
<Option type="3" />
<Option compiler="gcc" />
<Option createDefFile="1" />
<Option createStaticLib="1" />
<Compiler>
<Add option="-O2" />
<Add option="-m64" />
<Add option="-fPIC" />
<Add option="-DNLA3D_USE_MKL" />
<Add option="-DNLA3D_USE_PARALUTION" />
<Add directory="../../cuda_nla3d" />
<Add directory="../comsdk/dev" />
<Add directory="../easylogging" />
<Add directory="../math" />
<Add directory="../nla3d" />
<Add directory="/opt/intel/mkl/include" />
<Add directory="/usr/include/eigen3" />
<Add directory="../libgcdfes" />
</Compiler>
<Linker>
<Add option="-s" />
<Add option="-m64" />
<Add option="-lcomsdk" />
<Add option="-lnla3d" />
<Add option="-lmath" />
<Add option="-lparalution" />
<Add option="-lmkl_intel_lp64" />
<Add option="-lmkl_sequential" />
<Add option="-lmkl_core" />
<Add option="-lpthread" />
<Add option="-lm" />
<Add option="-ldl" />
<Add option="-lboost_system" />
<Add directory="../comsdk/rls" />
<Add directory="../math/bin/Release" />
<Add directory="../nla3d/bin/Release" />
<Add directory="../paralution-1.1.0/build/lib" />
<Add directory="/opt/intel/mkl/lib/intel64" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-Wall" />
<Add option="-fexceptions" />
</Compiler>
<Unit filename="FEReaders.cpp" />
<Unit filename="gcdfes.cpp" />
<Unit filename="gcdfes.h" />
<Extensions>
<code_completion />
<envvars />
<lib_finder disable_auto="1" />
<debugger />
</Extensions>
</Project>
</CodeBlocks_project_file>
#------------------------------------------------------------------------------#
# This makefile was generated by 'cbp2make' tool rev.147 #
#------------------------------------------------------------------------------#
WORKDIR = `pwd`
CC = gcc
CXX = g++
AR = ar
LD = g++
WINDRES = windres
INC =
CFLAGS = -Wall -fexceptions
RESINC =
LIBDIR =
LIB =
LDFLAGS =
INC_DEBUG = $(INC) -I../../cuda_nla3d -I../comsdk/dev -I../easylogging -I../math -I../nla3d -I/opt/intel/mkl/include -I/usr/include/eigen3 -I../libgcdfes
CFLAGS_DEBUG = $(CFLAGS) -m64 -g -fPIC -DNLA3D_USE_MKL -DNLA3D_USE_PARALUTION
RESINC_DEBUG = $(RESINC)
RCFLAGS_DEBUG = $(RCFLAGS)
LIBDIR_DEBUG = $(LIBDIR) -L../comsdk/rls -L../math/bin/Debug -L../nla3d/bin/Debug -L../paralution-1.1.0/build/lib -L/opt/intel/mkl/lib/intel64
LIB_DEBUG = $(LIB)
LDFLAGS_DEBUG = $(LDFLAGS) -m64 -lcomsdk -lnla3d -lmath -lparalution -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl -lboost_system
OBJDIR_DEBUG = obj/Debug
DEP_DEBUG =
OUT_DEBUG = bin/Debug/gcdfes.so
INC_RELEASE = $(INC) -I../../cuda_nla3d -I../comsdk/dev -I../easylogging -I../math -I../nla3d -I/opt/intel/mkl/include -I/usr/include/eigen3 -I../libgcdfes
CFLAGS_RELEASE = $(CFLAGS) -O2 -m64 -fPIC -DNLA3D_USE_MKL -DNLA3D_USE_PARALUTION
RESINC_RELEASE = $(RESINC)
RCFLAGS_RELEASE = $(RCFLAGS)
LIBDIR_RELEASE = $(LIBDIR) -L../comsdk/rls -L../math/bin/Release -L../nla3d/bin/Release -L../paralution-1.1.0/build/lib -L/opt/intel/mkl/lib/intel64
LIB_RELEASE = $(LIB)
LDFLAGS_RELEASE = $(LDFLAGS) -s -m64 -lcomsdk -lnla3d -lmath -lparalution -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl -lboost_system
OBJDIR_RELEASE = obj/Release
DEP_RELEASE =
OUT_RELEASE = bin/Release/gcdfes.so
OBJ_DEBUG = $(OBJDIR_DEBUG)/FEReaders.o $(OBJDIR_DEBUG)/gcdfes.o
OBJ_RELEASE = $(OBJDIR_RELEASE)/FEReaders.o $(OBJDIR_RELEASE)/gcdfes.o
all: debug release
clean: clean_debug clean_release
before_debug:
test -d bin/Debug || mkdir -p bin/Debug
test -d $(OBJDIR_DEBUG) || mkdir -p $(OBJDIR_DEBUG)
after_debug:
debug: before_debug out_debug after_debug
out_debug: before_debug $(OBJ_DEBUG) $(DEP_DEBUG)
$(LD) -shared $(LIBDIR_DEBUG) $(OBJ_DEBUG) -o $(OUT_DEBUG) $(LDFLAGS_DEBUG) $(LIB_DEBUG)
$(OBJDIR_DEBUG)/FEReaders.o: FEReaders.cpp
$(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c FEReaders.cpp -o $(OBJDIR_DEBUG)/FEReaders.o
$(OBJDIR_DEBUG)/gcdfes.o: gcdfes.cpp
$(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c gcdfes.cpp -o $(OBJDIR_DEBUG)/gcdfes.o
clean_debug:
rm -f $(OBJ_DEBUG) $(OUT_DEBUG)
rm -rf bin/Debug
rm -rf $(OBJDIR_DEBUG)
before_release:
test -d bin/Release || mkdir -p bin/Release
test -d $(OBJDIR_RELEASE) || mkdir -p $(OBJDIR_RELEASE)
after_release:
release: before_release out_release after_release
out_release: before_release $(OBJ_RELEASE) $(DEP_RELEASE)
$(LD) -shared $(LIBDIR_RELEASE) $(OBJ_RELEASE) -o $(OUT_RELEASE) $(LDFLAGS_RELEASE) $(LIB_RELEASE)
$(OBJDIR_RELEASE)/FEReaders.o: FEReaders.cpp
$(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c FEReaders.cpp -o $(OBJDIR_RELEASE)/FEReaders.o
$(OBJDIR_RELEASE)/gcdfes.o: gcdfes.cpp
$(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c gcdfes.cpp -o $(OBJDIR_RELEASE)/gcdfes.o
clean_release:
rm -f $(OBJ_RELEASE) $(OUT_RELEASE)
rm -rf bin/Release
rm -rf $(OBJDIR_RELEASE)
.PHONY: before_debug after_debug clean_debug before_release after_release clean_release
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment