📄 genfield.f90
字号:
!------------------------------------------------------------------------------!! MODULE : GENFIELD Auteur : J. Gressier! Date : Octobre 2002! Fonction Modif : (cf historique)! Bibliotheque de procedures et fonctions pour la gestion des champs! des differents solveurs!! Defauts/Limitations/Divers :! Historique :!!------------------------------------------------------------------------------!module GENFIELDuse TYPHMAKE ! Definition de la precision!use OUTPUTuse GEO3D ! use TENSOR3 ! use BASEFIELDimplicit none! -- Variables globales du module -------------------------------------------! -- DECLARATIONS -----------------------------------------------------------!------------------------------------------------------------------------------!! Definition de la structure ST_GENERICFIELD : Champ physique generique!------------------------------------------------------------------------------!type st_genericfield integer :: nscal, nvect, ntens ! dimension de champs integer :: dim ! nombre de valeurs par champ type(st_genericfield), pointer :: next ! pointeur de liste chainee type(st_scafield), dimension(:), pointer :: tabscal ! champs des scalaires type(st_vecfield), dimension(:), pointer :: tabvect ! champs des vecteurs type(st_tenfield), dimension(:), pointer :: tabtens ! champs des tenseursendtype st_genericfield! -- INTERFACES -------------------------------------------------------------interface new module procedure new_genericfield, new_genericfield_stendinterfaceinterface delete module procedure delete_genericfieldendinterfaceinterface insert module procedure insert_newgfieldendinterface! -- Fonctions et Operateurs ------------------------------------------------! -- IMPLEMENTATION ---------------------------------------------------------contains!------------------------------------------------------------------------------!! Procedure : allocation d'une structure GENERICFIELD!------------------------------------------------------------------------------!subroutine new_genericfield(gfield, dim, n_scal, n_vect, n_tens)implicit none type(st_genericfield) :: gfield ! champ a creerinteger :: dim ! nombre de cellules des champsinteger :: n_scal, n_vect, n_tens ! nombre de scalaires, vecteurs et tenseursinteger :: i!print*, "DEBUG NEW GENERIC FIELD" gfield%dim = dim gfield%nscal = n_scal gfield%nvect = n_vect gfield%ntens = n_tens if (gfield%nscal > 0) then allocate(gfield%tabscal(n_scal)) ! allocation du tableau de champs scalaires do i = 1, n_scal call new(gfield%tabscal(i), gfield%dim) ! allocation champ par champ enddo endif if (gfield%nvect > 0) then allocate(gfield%tabvect(n_vect)) ! allocation du tableau de champs vecteurs do i = 1, n_vect call new(gfield%tabvect(i), gfield%dim) ! allocation champ par champ enddo endif if (gfield%ntens > 0) then allocate(gfield%tabtens(n_tens)) ! allocation du tableau de champs tenseurs do i = 1, n_tens call new(gfield%tabtens(i), gfield%dim) ! allocation champ par champ enddo endifendsubroutine new_genericfield!------------------------------------------------------------------------------!! Procedure : allocation d'une structure FIELD a partir d'une autre structure!------------------------------------------------------------------------------!subroutine new_genericfield_st(newfield, oldfield)implicit nonetype(st_genericfield) :: newfield, oldfield ! champ a creer, et champ d'origine call new(newfield, oldfield%dim, oldfield%nscal, oldfield%nvect, oldfield%ntens)endsubroutine new_genericfield_st!------------------------------------------------------------------------------!! Procedure : initialisation d'une structure GENERICFIELD!------------------------------------------------------------------------------!subroutine init_genericfield(gfield, scal, vect)implicit nonetype(st_genericfield) :: gfield ! champ a creer, et champ d'originereal(krp) :: scal ! scalaire pour initialisationtype(v3d) :: vect ! vecteur pour initialisationinteger :: i do i = 1, gfield%nscal gfield%tabscal(i)%scal(:) = scal enddo do i = 1, gfield%nvect gfield%tabvect(i)%vect(:) = vect enddo do i = 1, gfield%ntens gfield%tabtens(i)%tens(:) = t3d(0._krp) enddoendsubroutine init_genericfield!------------------------------------------------------------------------------!! Procedure : desallocation d'une structure GENERICFIELD!------------------------------------------------------------------------------!subroutine delete_genericfield(gfield)implicit nonetype(st_genericfield) :: gfieldinteger :: i!print*, "DEBUG DELETE GFIELD", gfield%nscal, gfield%nvect, gfield%ntens if (gfield%nscal > 0) then do i = 1, gfield%nscal !!print*, "delete scalaire ",i call delete(gfield%tabscal(i)) enddo deallocate(gfield%tabscal) endif !! print*, "fin delete scalaire " if (gfield%nvect > 0) then do i = 1, gfield%nvect call delete(gfield%tabvect(i)) enddo deallocate(gfield%tabvect) endif if (gfield%ntens > 0) then do i = 1, gfield%ntens call delete(gfield%tabtens(i)) enddo deallocate(gfield%tabtens) endifendsubroutine delete_genericfield!------------------------------------------------------------------------------!! Procedure : creation et lien chaine d'une structure GENERICFIELD!------------------------------------------------------------------------------!function insert_newgfield(gfield,dim,nscal,nvect,ntens) result(pgfield)implicit nonetype(st_genericfield), pointer :: pgfieldtype(st_genericfield), target :: gfieldinteger :: dim,nscal,nvect,ntens allocate(pgfield) call new(pgfield,dim,nscal,nvect,ntens) pgfield%next => gfield endfunction insert_newgfield!------------------------------------------------------------------------------!! Procedure : desallocation d'une liste chainee de structure GENERICFIELD!------------------------------------------------------------------------------!subroutine delete_chainedgfield(gfield)implicit nonetype(st_genericfield), target :: gfieldtype(st_genericfield), pointer :: pgfield, dgfield pgfield => gfield do while(associated(pgfield)) dgfield => pgfield pgfield => pgfield%next call delete(dgfield) enddoendsubroutine delete_chainedgfieldendmodule GENFIELD!------------------------------------------------------------------------------!! Historique des modifications!! oct 2002 : creation du module! juin 2003 : structuration des champs par type (scalaire, vecteur...)! DEV: interface champ/tableau! DEV: decoupage en MGFIELD et MZFIELD pour fonctions haut et bas niveau! juin 2004 : procedures insert_newgfield et delete_chainedgfield! nov 2004 : split DEFFIELD -> DEFFIELD / GENFIELD / BASEFIELD!------------------------------------------------------------------------------!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -