Commit 4bf91607 authored by mozul's avatar mozul
Browse files

Merge commit '3570302c'

Preparing 2015.2 version
parents 77f616dc 3570302c
......@@ -42,55 +42,18 @@ if(${MUMPS_VERSION} STREQUAL "none") # if mumps not asked
# if no mumps asked
message(STATUS "No sparse linear algebra library used")
set(LMGC90_BINDINGS_SPARSE_LA_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/Std_SparseLinearAlgebra.f90)
#set(LMGC90_BINDINGS_SPARSE_LA_TARGET_LIBS)
add_library(lmgc_bindings_sparse_la ${LMGC90_BINDINGS_SPARSE_LA_SRCS})
else(${MUMPS_VERSION} STREQUAL "none")
if(${MUMPS_VERSION} STREQUAL "sequential")
# if sequential mumps asked look for libraries
set(SEARCH_MPISEQ TRUE)
set(WITH_MUMPS TRUE)
find_package(MUMPS REQUIRED)
# set WITH_MPI if not already set
if( NOT WITH_MPI)
SET(WITH_MPI ON)
endif( NOT WITH_MPI)
elseif(${MUMPS_VERSION} STREQUAL "parallel")
# if parallel mumps asked look for libraries
set(WITH_MUMPS TRUE)
set(SEARCH_MPISEQ FALSE)
find_package(MUMPS REQUIRED)
# find corresponding module
find_file(LMGC90_BINDINGS_SPARSE_LA_SRCS
NAMES "Mumps_SparseLinearAlgebra.f90"
PATHS ${CMAKE_SOURCE_DIR}/contribs/lapack_LinearAlgebra
NO_DEFAULT_PATH
)
# error if WITH_MPI is not already set
if( NOT WITH_MPI)
message(FATAL_ERROR "Use of parallel sparse linear algebra found, but no option WITH_MPI. Make sure to enable WITH_MPI option and provide a 'mpif90' compiler in CMAKE_Fortran_COMPILER variable (or use a sequential version)")
endif( NOT WITH_MPI)
endif(${MUMPS_VERSION} STREQUAL "sequential")
# find corresponding module
find_file(LMGC90_BINDINGS_SPARSE_LA_SRCS
NAMES "Mumps_SparseLinearAlgebra.f90"
PATHS ${CMAKE_SOURCE_DIR}/contribs/lapack_LinearAlgebra
NO_DEFAULT_PATH
)
set(LMGC90_BINDINGS_SPARSE_LA_SRCS "${CMAKE_SOURCE_DIR}/contribs/linearAlgebra/Mumps_SparseLinearAlgebra.f90")
message(STATUS "Sparse linear algebra include path found: ${MUMPS_INCLUDE_DIRS}")
message(STATUS "Sparse linear algebra libraries found: ${MUMPS_LIBRARIES}")
message(STATUS "Sparse linear algebra libraries user add : ${ADD_MUMPS_LIBRARIES}")
message(STATUS "Sparse linear algebra binding found: ${LMGC90_BINDINGS_SPARSE_LA_SRCS}")
INCLUDE_DIRECTORIES( ${MUMPS_INCLUDE_DIRS} )
include_directories( ${MUMPS_INCLUDE_DIRS} )
add_library(lmgc_bindings_sparse_la ${LMGC90_BINDINGS_SPARSE_LA_SRCS})
target_link_libraries(lmgc_bindings_sparse_la ${MUMPS_LIBRARIES} ${ADD_MUMPS_LIBRARIES})
target_link_libraries(lmgc_bindings_sparse_la ${MUMPS_LIBRARIES})
endif(${MUMPS_VERSION} STREQUAL "none")
......
......@@ -197,9 +197,8 @@ end subroutine
!--- adding dummy function of RAM for DDM ---!
subroutine ExternalFEM_compute_dv_from_other_domains(dom_id)
subroutine ExternalFEM_compute_dv_from_other_domains
implicit none
integer(kind=4), intent(in) :: dom_id
!
......
......@@ -97,12 +97,16 @@ option(BUILD_rTree_BINDING "Build Python binding of rTree library" ON)
option(WITH_SICONOS_NUMERICS "Activate SiconosNumerics contact solvers use" OFF)
option(WITH_MEDPRE "Look for med library and activate medpre reading features" OFF)
option(GFORTRAN44_PATCHING "Apply patch when using gfortran 4.4 (which is very buggy)" OFF)
# Lapack options
set(MUMPS_VERSION "none" CACHE STRING "Use of MUMPS library" )
set(MUMPS_VERSION "sequential" CACHE STRING "Use of MUMPS library" )
set_property(CACHE MUMPS_VERSION PROPERTY STRINGS
"none" "sequential" "parallel"
)
option(COMPILE_LAPACK "Compile BLAS/LAPACK ?" OFF)
option(BUILD_MUMPS "Build MUMPs and scalapack from scratch?" OFF)
option(BUILD_LAPACK "Build BLAS/LAPACK from scratch?" OFF)
set(MATLIB_PATH CACHE PATH "Path to LMGC90v2_BindingExternalModels")
......@@ -140,6 +144,39 @@ if(NOT ${MATLIB_VERSION} STREQUAL "off")
find_package(MatLib_FOR_LMGC REQUIRED)
endif(NOT ${MATLIB_VERSION} STREQUAL "off")
if(WITH_MPI)
set(MUMPS_VERSION "parallel")
endif(WITH_MPI)
if(NOT ${MUMPS_VERSION} STREQUAL "none" AND NOT BUILD_MUMPS )
if( ${MUMPS_VERSION} STREQUAL "sequential" AND MUMPS_LIBRARY_DIRECTORY )
if(${MUMPS_VERSION} STREQUAL "sequential")
set(SEARCH_MPISEQ=True)
endif(${MUMPS_VERSION} STREQUAL "sequential")
find_package(MUMPS)
if(NOT MUMPS_FOUND)
set(BUILD_MUMPS True)
endif(NOT MUMPS_FOUND)
elseif( ${MUMPS_VERSION} STREQUAL "parallel" )
find_package(MUMPS)
if(NOT MUMPS_FOUND)
set(BUILD_MUMPS True)
endif(NOT MUMPS_FOUND)
else()
set(BUILD_MUMPS True)
endif()
endif(NOT ${MUMPS_VERSION} STREQUAL "none" AND NOT BUILD_MUMPS )
# getting some packages for doc generation
find_package(Doxygen)
......@@ -153,11 +190,11 @@ if( WITH_SICONOS_NUMERICS )
endif( WITH_SICONOS_NUMERICS )
# looking for lapack libraries before compiling
if( NOT COMPILE_LAPACK )
if( NOT BUILD_LAPACK )
find_package(LAPACK)
if( NOT LAPACK_FOUND )
message( STATUS "could not find lapack... it is going to be compile first")
set( COMPILE_LAPACK ON)
set( BUILD_LAPACK ON)
endif()
endif()
......
......@@ -7,6 +7,7 @@ set( headers_list )
set( sources_list )
ADD_SUBDIRECTORY(src)
add_subdirectory(utils)
# dependencies
SET(LMGC90_PYTHON_LINK_LIBRARIES lmgc_python_shared
......@@ -125,6 +126,7 @@ if(BUILD_ChiPy)
add_custom_target(chipy_swig_docstrings DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/docs/chipy_swig_docstrings.i)
else(${WITH_DOCSTRING})
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/docs/chipy_swig_docstrings.i
DEPENDS ${headers_list}
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_SOURCE_DIR}/docs/chipy_swig_docstrings.i
${CMAKE_CURRENT_BINARY_DIR}/docs/chipy_swig_docstrings.i
......@@ -139,12 +141,14 @@ if(BUILD_ChiPy)
# defining swig target
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/pylmgc90/chipy)
SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/chipy.i PROPERTIES CPLUSPLUS ON )
set(SWIG_MODULE_lmgc90_EXTRA_DEPS ${NUMPY_DOT_I})
SWIG_ADD_MODULE(lmgc90 python ${CMAKE_CURRENT_BINARY_DIR}/chipy.i)
add_dependencies(${SWIG_MODULE_lmgc90_REAL_NAME} chipy_swig_docstrings)
SWIG_LINK_LIBRARIES(lmgc90 ${PYTHON_LIBRARIES}
${LMGC90_PYTHON_LINK_LIBRARIES}
${LAPACK_LIBRARIES}
utilsFortran
)
set_property(TARGET ${SWIG_MODULE_lmgc90_REAL_NAME} PROPERTY LINKER_LANGUAGE Fortran)
# ugly but necessary...
......@@ -159,11 +163,12 @@ if(BUILD_ChiPy)
ARGS -Ddir=${CMAKE_SOURCE_DIR}
-Dfile_in=${CMAKE_CURRENT_SOURCE_DIR}/src/macro/__init__.py.in
-Dfile_out=${CMAKE_BINARY_DIR}/pylmgc90/__init__.py
-DGIT_EXECUTABLE=${GIT_EXECUTABLE}
-P ${CMAKE_SOURCE_DIR}/tools/cmake/modules/set_revision_number.cmake
)
add_custom_command(TARGET ${SWIG_MODULE_lmgc90_REAL_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/lmgc90.py
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/lmgc90.py
${CMAKE_BINARY_DIR}/pylmgc90/chipy/lmgc90.py)
if( WITH_NEW )
set( l __init__.py chipy.py vtk_display.py preconW.py ddm_utils.py)
......@@ -171,9 +176,10 @@ if(BUILD_ChiPy)
set( l __init__.py chipy.py vtk_display.py preconW.py ddm_utils.py new_arch_post_utils.py)
endif( WITH_NEW )
foreach( f ${l} )
add_custom_command(TARGET ${SWIG_MODULE_lmgc90_REAL_NAME} POST_BUILD
add_custom_target(${f} ALL
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/ChiPy/src/macro/${f}
${CMAKE_BINARY_DIR}/pylmgc90/chipy/${f}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/macro/${f}
)
endforeach( f ${l} )
if(NOT ${PYTHON_VERSION_MAJOR} LESS 3)
......
......@@ -43,6 +43,7 @@
#include "src/shared/wrap_tact_behav.h"
#include "src/shared/wrap_timer.h"
#include "src/shared/wrap_utilities.h"
#include "src/shared/wrap_a_EF.h"
#include "src/contact_2D/wrap_CLALp.h"
#include "src/contact_2D/wrap_CLJCx.h"
......@@ -448,6 +449,7 @@ import_array();
%include "src/shared/wrap_tact_behav.h"
%include "src/shared/wrap_timer.h"
%include "src/shared/wrap_utilities.h"
%include "src/shared/wrap_a_EF.h"
%include "src/contact_2D/wrap_CLALp.h"
%include "src/contact_2D/wrap_CLJCx.h"
......
......@@ -151,7 +151,7 @@ call MPI_BARRIER(MPI_COMM_WORLD, code_MPI)
CALL prep_check_nlgs(iconv)
if( timer_id_check /= 0 ) call stop_itimer(timer_id_check)
IF (iconv == 0 ) RETURN !<- c est quoi cette merde !!!
!IF (iconv == 0 ) RETURN !<- c est quoi cette merde !!!
!raf: je commente cette fonction est deja dans prep_check_nlgs
!if( timer_id_rnodhrolc /= 0 ) call start_itimer(timer_id_rnodhrolc)
......@@ -281,7 +281,7 @@ call MPI_BARRIER(MPI_COMM_WORLD, code_MPI)
if( timer_id_check /= 0 ) call start_itimer(timer_id_check)
CALL prep_check_nlgs(iconv)
if( timer_id_check /= 0 ) call stop_itimer(timer_id_check)
IF (iconv == 0 ) RETURN
!IF (iconv == 0 ) RETURN
!raf ajout
if( timer_id_exchange /= 0 ) call start_itimer(timer_id_exchange)
call compute_dv_from_other_domains
......
......@@ -140,6 +140,11 @@ def Finalize():
if not is_vtk_display:
display_3D_CleanMemory()
post2D_CleanMemory()
post3D_CleanMemory()
postpro_CleanMemory()
postpro_3D_CleanMemory()
timer_WriteOutTimers()
overall_Finalize()
......@@ -1059,7 +1064,7 @@ def OpenDisplayFiles(ref_reac=0.):
post3D_Init()
display_3D_Init(0)
def WriteDisplayFiles(freq=1,ref_radius=1.,**kw):
def WriteDisplayFiles(freq=1,ref_radius=1.,normal_orient=True,**kw):
"""Write visualization files if current time step number is a multiple of freq in DISPLAY directory.
ref_radius allows to normalize the size of the fries representing the interactions.
......@@ -1094,7 +1099,7 @@ def WriteDisplayFiles(freq=1,ref_radius=1.,**kw):
writePorofeToVTK(os.path.join(wd,'DISPLAY','porofe_'+str(wdf)+'.vtu'),fip,DIMENSION,**poro_opt)
writeMultifeToVTK(os.path.join(wd,'DISPLAY','multife_'+str(wdf)+'.vtu'),fiu,DIMENSION,**multi_opt)
writeTactorsToVTK(os.path.join(wd,'DISPLAY','tacts_'+str(wdf)+'.vtp'),fit,tacts_dict,**tact_opt)
writeIntersToVTK(os.path.join(wd,'DISPLAY','inters_'+str(wdf)+'.vtp'),fii,inters_dict,ref_radius,**inter_opt)
writeIntersToVTK(os.path.join(wd,'DISPLAY','inters_'+str(wdf)+'.vtp'),fii,inters_dict,ref_radius,normal_orient,**inter_opt)
writeRigidsToVTK(os.path.join(wd,'DISPLAY','rigids_'+str(wdf)+'.vtu'),fir,DIMENSION,**rigid_opt)
else:
......
......@@ -525,7 +525,7 @@ def InitInter(dict,name):
dict[name]=vals
def pushInters2D(inters_dict,Append,lr,kw):
def pushInters2D(inters_dict,Append,lr,normal_orient,kw):
nb_write=0
......@@ -600,14 +600,18 @@ def pushInters2D(inters_dict,Append,lr,kw):
if ref_reac != 0.: seuil_fn = ref_reac
if fn*fn+ft*ft < 1.e-12 :
nnx = nx
nny = ny
else :
nnx = ( fn*nx + ft*ny ) / math.sqrt( fn*fn+ft*ft )
nny = ( fn*ny - ft*nx ) / math.sqrt( fn*fn+ft*ft )
if normal_orient:
vertex = buildFrite(coorx,coory,nx,ny,fn/seuil_fn,lr)
else:
vertex = buildFrite(coorx,coory,nx,ny,fn/seuil_fn,lr)
if fn*fn+ft*ft < 1.e-12 :
nnx = nx
nny = ny
else :
nnx = ( fn*nx + ft*ny ) / math.sqrt( fn*fn+ft*ft )
nny = ( fn*ny - ft*nx ) / math.sqrt( fn*fn+ft*ft )
vertex = buildFrite(coorx,coory,nnx,nny,fn/seuil_fn,lr)
num_points = 0
cell_ids=[]
......@@ -652,7 +656,7 @@ def pushInters2D(inters_dict,Append,lr,kw):
return nb_write
def pushInters3D(inters_dict,Append,lr,kw):
def pushInters3D(inters_dict,Append,lr,normal_orient,kw):
nb_write=0
......@@ -724,14 +728,21 @@ def pushInters3D(inters_dict,Append,lr,kw):
if ref_reac != 0.: seuil_fn = ref_reac
if fn*fn+ft*ft < 1.e-12 :
nnx = nx
nny = ny
else :
nnx = ( fn*nx + ft*ny ) / math.sqrt( fn*fn+ft*ft )
nny = ( fn*ny - ft*nx ) / math.sqrt( fn*fn+ft*ft )
if normal_orient:
vertex = buildFrite3D(coorx,coory,coorz,nx,ny,nz,tx,ty,tz,fn/seuil_fn,lr)
else:
if fn*fn+ft*ft < 1.e-12 :
nnx = nx; nny = ny; nnz = nz
ttx = tx; tty = ty; ttz = tz
else :
nnx = ( fn*nx + ft*tx ) / math.sqrt( fn*fn+ft*ft )
nny = ( fn*ny + ft*ty ) / math.sqrt( fn*fn+ft*ft )
nnz = ( fn*nz + ft*tz ) / math.sqrt( fn*fn+ft*ft )
ttx = nnz; tty = nnz; ttz = -nnx-nny
vertex = buildFrite3D(coorx,coory,coorz,nx,ny,nz,tx,ty,tz,fn/seuil_fn,lr)
vertex = buildFrite3D(coorx,coory,coorz,nnx,nny,nnz,ttx,tty,ttz,fn/seuil_fn,lr)
num_points = 0
#cell_ids=[]
......@@ -1025,7 +1036,7 @@ def InitIntersToVTK(inters_list,inters_dict,rr=0.):
for inter in inters_list:
InitInter(inters_dict,inter)
def writeIntersToVTK(fichier,fid,inters_dict,lr,**kw):
def writeIntersToVTK(fichier,fid,inters_dict,lr,normal_orient=True,**kw):
vtpFile = vtkXMLPolyDataWriter()
vtpFile.SetIdTypeToInt32()
......@@ -1035,10 +1046,10 @@ def writeIntersToVTK(fichier,fid,inters_dict,lr,**kw):
if inters_dict.keys()[0] in ['CDCDx', 'CDPLx', 'CSASp', 'CSPRx', 'PRPLx', 'PRPRx', 'PTPT3', 'SPCDx', 'SPDCx', 'SPPLx', 'SPSPx']:
nb = pushInters3D(inters_dict,AppendAll,lr,kw)
nb = pushInters3D(inters_dict,AppendAll,lr,normal_orient,kw)
else:
nb = pushInters2D(inters_dict,AppendAll,lr,kw)
nb = pushInters2D(inters_dict,AppendAll,lr,normal_orient,kw)
# si on a bien ecrit qq ch
......
......@@ -114,15 +114,19 @@ MODULE wrap_mecaMAILx
compute_rayleigh_damping_mecaMAILx, &
compute_rayleigh_damping_discrete_mecaMAILx, &
rigid_vtk_draw_all_mecaMAILx, &
!<
is_rigid_mecaMAILx, &
get_RcoorTT_mecaMAILx, &
get_Rcooref_mecaMAILx, &
get_Rinertia_frameTT_mecaMAILx, &
get_coorTT_nodty_mecaMAILx, &
get_cooref_nodty_mecaMAILx, &
set_RV_driven_dofs_mecaMAILx, &
set_RV_driven_dof_value_mecaMAILx, &
put_Rvector_mecaMAILx, &
get_Rvector_mecaMAILx, &
!>
DISPLAY_bulk_element_mecaMAILx, &
Set_RV_driven_dofs_mecaMAILx, &
Set_RV_driven_dof_value_mecaMAILx, &
!!add_spring_to_node_mecaMAILx, &
apply_drvdof_KT_mecaMAILx, &
get_matrix_mecaMAILx , & !rm
......@@ -1660,6 +1664,9 @@ CONTAINS
end subroutine
!< rigid, coro
function IsRigid(ibdyty) bind(c, name='mecaMAILx_IsRigid')
implicit none
integer(c_int), intent(in), value :: ibdyty
......@@ -1671,8 +1678,15 @@ CONTAINS
IsRigid = 0
end if
end function
end function IsRigid
subroutine SetTolCoro(tol) bind(c, name='mecaMAILx_SetTolCoro')
implicit none
real(c_double), intent(in), value :: tol
call set_tol_coro_mecaMAILx(tol)
end subroutine
SUBROUTINE GetRigidFrameTT(ibdyty,rvect,ivalue1,ivalue2) bind(c, name='mecaMAILx_GetRigidFrameTT')
use overall, only: nbDIME
IMPLICIT NONE
......@@ -1775,10 +1789,56 @@ CONTAINS
real(c_double),intent(in),value :: rv
CALL Set_RV_driven_dof_value_mecaMAILx(ibdyty,idof,rv)
CALL Set_RV_driven_dof_value_mecaMAILx(ibdyty,idof,rv)
END SUBROUTINE SetRVDrivenDofValue
SUBROUTINE PutBodyRVector(cvalue1_c,ivalue1,rvect,ivalue2) bind(c, name='mecaMAILx_PutBodyRVector')
IMPLICIT NONE
CHARACTER(c_char), DIMENSION(5),INTENT(in) :: cvalue1_c
INTEGER(c_int),INTENT(in), value :: ivalue1,ivalue2
REAL(c_double),INTENT(in) :: rvect(ivalue2)
!
CHARACTER(len=5) :: cvalue1
INTEGER :: i
cvalue1 = ''
DO i=1,5
cvalue1 = cvalue1(1:i-1) // cvalue1_c(i)
END DO
CALL put_Rvector_mecaMAILx(cvalue1,ivalue1,rvect,ivalue2)
END SUBROUTINE
SUBROUTINE GetBodyRVector(cvalue1_c,ivalue1,rvect,ivalue2) bind(c, name='mecaMAILx_GetBodyRVector')
implicit none
character(c_char), dimension(5),intent(in) :: cvalue1_c
integer(c_int),intent(in), value :: ivalue1
integer(c_int) :: ivalue2
type(c_ptr) :: rvect
!
real(c_double), dimension(:), pointer :: vector
character(len=5) :: cvalue1
integer :: i
cvalue1 = ''
DO i=1,5
cvalue1 = cvalue1(1:i-1) // cvalue1_c(i)
END DO
ivalue2 = 6
allocate(vector(ivalue2))
CALL get_Rvector_mecaMAILx(cvalue1,ivalue1,vector,ivalue2)
rvect = c_loc(vector(1))
END SUBROUTINE
! rigid, coro >
subroutine GetBodyMatrix(cvalue_c, ibdyty, rmat, size1, size2) bind(c, name='mecaMAILx_GetBodyMatrix')
implicit none
character(c_char), dimension(5), intent(in) :: cvalue_c
......@@ -1853,15 +1913,6 @@ CONTAINS
call comp_drv_vlocy_mecaMAILx(ibdyty, values)
end subroutine
!!!-PTA--21/01/2012----------------------------------
subroutine SetTolCoro(tol) bind(c, name='mecaMAILx_SetTolCoro')
implicit none
real(c_double), intent(in), value :: tol
call set_tol_coro_mecaMAILx(tol)
end subroutine
!!! END PTA
SUBROUTINE SetVlocyDrivenDof(IdBody,f_dof,f_node,f_value) bind(c, name='mecaMAILx_SetVlocyDrivenDof')
IMPLICIT NONE
INTEGER(C_INT), INTENT(IN), VALUE :: IdBody,f_dof
......@@ -2096,7 +2147,7 @@ CONTAINS
real(kind=8),dimension(:),pointer :: s
!
size1=3
size1=5
allocate(s(size1))
s = Compute_Info_PrincipalStressField_mecaMAILx(ibdyty)
......
......@@ -491,6 +491,57 @@ Managing rigid models
* @endcond
*/
extern "C" void mecaMAILx_SetRVDrivenDofValue(int IdBody, int IdDof, double rv);
/**
* @fn void mecaMAILx_PutBodyRVector(char * cvalue1, int ivalue1, double * rvector_in, int rlength_in)
* @brief Set a vector of a coro or rigid mecaMAILx body
*
* @cond PYDOC
* python usage : mecaMAILx_PutBodyRVector(datatype, ibdyty, vector)
* @param[in] datatype (string [5]) : the vector to set
* @param[in] ibdyty (integer) : rank of the RBDY3
* @param[in] vector (double array) : the new value of the vector
* @endcond
*
* \n possible values for datatype field are 'X____', 'Xbeg_',
* 'V____', 'Vbeg_', 'Raux_', 'Vfree', 'Fext_'\n
* uses copy, and in case fo Fext, the operation is not
* just setting but adding\n
*
* @cond CDOC
* @param[in] cvalue1 (char[5]) : the vector to set
* @param[in] ivalue1 (int) : rank of the RBDY3
* @param[in] vector_in (double *) : the new vector
* @param[in] length (int) : the length of vector_in
* @endcond
*/
extern "C" void mecaMAILx_PutBodyRVector(char * cvalue1, int ivalue1, double * rvector_in, int rlength_in);
/**
* @fn void mecaMAILx_GetBodyRVector(char * cvalue1, int ivalue1, double** r8_vector, int* r8_size)
* @brief Get a copy of a vector of a mecaMAILx body
*
* @cond PYDOC
* python usage : vector = mecaMAILx_GetBodyRVector(datatype, ibdyty)
* @param[in] datatype (string [5]) : the vector to get
* @param[in] ibdyty (integer) : rank of the RBDY3
* @return vector (double array) : output vector
* @endcond
*
* \n
* possible values for datatype field are:
* 'Coor0', 'Coor_', 'Coorb','Coorm',
* 'X____', 'Xbeg_',
* 'V____', 'Vbeg_', 'Vaux_','Vfree',
* 'Reac_', 'Fext_', 'Fint_'\n
*
* @cond CDOC
* @param[in] cvalue1 (char[5]) : the vector to get
* @param[in] ivalue1 (int) : rank of the RBDY3
* @param[out] r8_vector (double**) : the out vector
* @param[out] r8_size (int*) : the length of r8_vector
* @endcond
*/
extern "C" void mecaMAILx_GetBodyRVector(char * cvalue1, int ivalue1, double** r8_vector, int* r8_size);
/**
......
......@@ -17,18 +17,17 @@
\section sec1 Reminders
Reference web sites of LMGC90"s users :
https://subver.lmgc.univ-montp2.fr/trac_LMGC90v2/wiki
https://git-xen.lmgc.univ-montp2.fr/lmgc90/lmgc90_user/wikis/home
Reference web sites of LMGC90"s developpers :
https://subver.lmgc.univ-montp2.fr/trac_LMGC90v2_dev/wiki
https://git-xen.lmgc.univ-montp2.fr/lmgc90/lmgc90_dev/wikis/home
These sites give reminders on how to download and build the software.
Theoretical documentation and tutorial can be found in :
LMGC90v2/rev_2009/manuals and LMGC90v2/rev_2010/manuals
Theoretical documentation and tutorial can be found in the "manuals" directory once
the sources of the software is downloaded.
To generate again this documentation in LMGC90v2_dev directory,
after setting the DOXYGEN variable in the makefile, type :
To generate again this documentation in your build directory type :
"make docs"
......
......@@ -57,7 +57,8 @@ MODULE wrap_post2D
put_material_ID_post2D, &
GMV_circular_selection, &
get_write_gmv_post2D , &
reset_post2D
reset_post2D, &
clean_memory_post2D
use utilities
......@@ -305,4 +306,11 @@ CONTAINS
end subroutine
subroutine CleanMemory() bind(c, name='post2D_CleanMemory')
implicit none
call clean_memory_post2D
end subroutine
END MODULE wrap_post2D
......@@ -270,4 +270,14 @@
*/
extern "C" void post2D_reset(void);
/**
* @fn void post2D_CleanMemory(void)
* @brief Free all memory allocated within post2D module
*
* @cond PYDOC
* python usage : post2D_CleanMemory()
* @endcond
*/