diff --git a/CMakeLists.txt b/CMakeLists.txt index 694f13d5808c3d460c338b254f1992bb2150ee58..dc2a8967d038144b5c7a49bd952f623730b3fce7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -142,7 +142,7 @@ else() set(GMSH_GITLAB_PREFIX "${GMSH_GITLAB_PREFIX}/blob/master") endif() -set(GMSH_API api/gmsh.h api/gmshc.h api/gmsh.h_cwrap api/gmshf.h) +set(GMSH_API api/gmsh.h api/gmshc.h api/gmsh.h_cwrap api/gmsh.f90) if(ENABLE_PRIVATE_API) message(WARNING "The private API is unsupported and undocumented. It is meant " diff --git a/api/GenApi.py b/api/GenApi.py index 93b0eb2b64654b27ec326d5c92b5001ea78eba8a..18e000c5ad6dd15694933b7dbc20dc31b2fc4765 100644 --- a/api/GenApi.py +++ b/api/GenApi.py @@ -89,7 +89,7 @@ def istring(name, value=None, python_value=None, julia_value=None): a.python_arg = "c_char_p(" + name + ".encode())" a.cwrap_arg = name + ".c_str()" a.julia_ctype = "Ptr{Cchar}" - a.fortran_type = "character(len = 1, kind = c_char)" + a.fortran_type = "character(len=1, kind=c_char)" a.fortran_type_post = "(*)" return a @@ -125,8 +125,8 @@ def ivectorint(name, value=None, python_value=None, julia_value=None): a.julia_ctype = "Ptr{Cint}, Csize_t" a.julia_arg = "convert(Vector{Cint}, " + name + "), length(" + name + ")" a.fortran_type = "integer(c_int)" - a.fortran_type_post = "(*)\n integer(c_size_t), value :: " + name + "_n" - a.fortran_name_post = ",\n & " + name + "_n" + a.fortran_type_post = "(*)\n" + " " * 8 + "integer(c_size_t), value :: " + name + "_n" + a.fortran_name_post = ", " + name + "_n" return a @@ -151,8 +151,8 @@ def ivectorsize(name, value=None, python_value=None, julia_value=None): a.julia_ctype = "Ptr{Csize_t}, Csize_t" a.julia_arg = "convert(Vector{Csize_t}, " + name + "), length(" + name + ")" a.fortran_type = "integer(c_size_t)" - a.fortran_type_post = "(*)\n integer(c_size_t), value :: " + name + "_n" - a.fortran_name_post = ",\n & " + name + "_n" + a.fortran_type_post = "(*)\n" + " " * 8 + "integer(c_size_t), value :: " + name + "_n" + a.fortran_name_post = ", " + name + "_n" return a @@ -177,8 +177,8 @@ def ivectordouble(name, value=None, python_value=None, julia_value=None): a.julia_ctype = "Ptr{Cdouble}, Csize_t" a.julia_arg = "convert(Vector{Cdouble}, " + name + "), length(" + name + ")" a.fortran_type = "real(c_double)" - a.fortran_type_post = "(*)\n integer(c_size_t), value :: " + name + "_n" - a.fortran_name_post = ",\n & " + name + "_n" + a.fortran_type_post = "(*)\n" + " " * 8 + "integer(c_size_t), value :: " + name + "_n" + a.fortran_name_post = ", " + name + "_n" return a @@ -203,8 +203,8 @@ def ivectorstring(name, value=None, python_value=None, julia_value=None): a.julia_ctype = "Ptr{Ptr{Cchar}}, Csize_t" a.julia_arg = name + ", length(" + name + ")" a.fortran_type = "type(c_ptr)" - a.fortran_type_post = "(*)\n integer(c_size_t), value :: " + name + "_n" - a.fortran_name_post = ",\n & " + name + "_n" + a.fortran_type_post = "(*)\n" + " " * 8 + "integer(c_size_t), value :: " + name + "_n" + a.fortran_name_post = ", " + name + "_n" return a @@ -234,8 +234,8 @@ def ivectorpair(name, value=None, python_value=None, julia_value=None): "))\n " + api_name_n + " = length(" + api_name + ")") a.julia_arg = (api_name + ", " + api_name_n) a.fortran_type = "integer(c_int)" - a.fortran_type_post = "(*)\n integer(c_size_t), value :: " + name + "_n" - a.fortran_name_post = ",\n & " + name + "_n" + a.fortran_type_post = "(*)\n" + " " * 8 + "integer(c_size_t), value :: " + name + "_n" + a.fortran_name_post = ", " + name + "_n" return a @@ -272,9 +272,9 @@ def ivectorvectorint(name, value=None, python_value=None, julia_value=None): a.julia_arg = ("convert(Vector{Vector{Cint}}," + name + "), " + api_name_n + ", length(" + name + ")") a.fortran_type = "type(c_ptr), intent(out)" - a.fortran_type_post = ("\n type(c_ptr), intent(out) :: " + name + - "_n\n integer(c_size_t) :: " + name + "_nn") - a.fortran_name_post = ",\n & " + name + "_n,\n & " + name + "_nn" + a.fortran_type_post = ("\n" + " " * 8 + "type(c_ptr), intent(out) :: " + name + + "_n\n" + " " * 8 + "integer(c_size_t) :: " + name + "_nn") + a.fortran_name_post = ", " + name + "_n," + name + "_nn" return a @@ -312,9 +312,9 @@ def ivectorvectorsize(name, value=None, python_value=None, julia_value=None): a.julia_arg = ("convert(Vector{Vector{Csize_t}}," + name + "), " + api_name_n + ", length(" + name + ")") a.fortran_type = "type(c_ptr), intent(out)" - a.fortran_type_post = ("\n type(c_ptr), intent(out) :: " + name + - "_n\n integer(c_size_t) :: " + name + "_nn") - a.fortran_name_post = ",\n & " + name + "_n,\n & " + name + "_nn" + a.fortran_type_post = ("\n" + " " * 8 + "type(c_ptr), intent(out) :: " + name + + "_n\n" + " " * 8 + "integer(c_size_t) :: " + name + "_nn") + a.fortran_name_post = ", " + name + "_n," + name + "_nn" return a @@ -352,9 +352,9 @@ def ivectorvectordouble(name, value=None, python_value=None, julia_value=None): a.julia_arg = ("convert(Vector{Vector{Cdouble}}," + name + "), " + api_name_n + ", length(" + name + ")") a.fortran_type = "type(c_ptr), intent(out)" - a.fortran_type_post = ("\n type(c_ptr), intent(out) :: " + - name + "_n\n integer(c_size_t) :: " + name + "_nn") - a.fortran_name_post = ",\n & " + name + "_n,\n & " + name + "_nn" + a.fortran_type_post = ("\n" + " " * 8 + "type(c_ptr), intent(out) :: " + + name + "_n\n" + " " * 8 + "integer(c_size_t) :: " + name + "_nn") + a.fortran_name_post = ", " + name + "_n," + name + "_nn" return a @@ -476,8 +476,8 @@ def ovectorint(name, value=None, python_value=None, julia_value=None): a.julia_post = (name + " = unsafe_wrap(Array, " + api_name + "[], " + api_name_n + "[], own = true)") a.fortran_type = "type(c_ptr), intent(out)" - a.fortran_type_post = "\n integer(c_size_t) :: " + name +"_n" - a.fortran_name_post = ",\n & " + name + "_n" + a.fortran_type_post = "\n" + " " * 8 + "integer(c_size_t) :: " + name +"_n" + a.fortran_name_post = ", " + name + "_n" return a @@ -504,8 +504,8 @@ def ovectorsize(name, value=None, python_value=None, julia_value=None): a.julia_post = (name + " = unsafe_wrap(Array, " + api_name + "[], " + api_name_n + "[], own = true)") a.fortran_type = "type(c_ptr), intent(out)" - a.fortran_type_post = "\n integer(c_size_t) :: " + name + "_n" - a.fortran_name_post = ",\n & " + name + "_n" + a.fortran_type_post = "\n" + " " * 8 + "integer(c_size_t) :: " + name + "_n" + a.fortran_name_post = ", " + name + "_n" return a @@ -532,8 +532,8 @@ def ovectordouble(name, value=None, python_value=None, julia_value=None): a.julia_post = (name + " = unsafe_wrap(Array, " + api_name + "[], " + api_name_n + "[], own = true)") a.fortran_type = "type(c_ptr), intent(out)" - a.fortran_type_post = "\n integer(c_size_t) :: " + name + "_n" - a.fortran_name_post = ",\n & " + name + "_n" + a.fortran_type_post = "\n" + " " * 8 + "integer(c_size_t) :: " + name + "_n" + a.fortran_name_post = ", " + name + "_n" return a @@ -565,8 +565,8 @@ def ovectorstring(name, value=None, python_value=None, julia_value=None): " = [unsafe_string(tmp_" + api_name + "[i]) for i in 1:length(tmp_" + api_name + ") ]") a.fortran_type = "type(c_ptr), intent(out)" - a.fortran_type_post = "\n integer(c_size_t) :: " + name + "_n" - a.fortran_name_post = ",\n & " + name + "_n" + a.fortran_type_post = "\n" + " " * 8 + "integer(c_size_t) :: " + name + "_n" + a.fortran_name_post = ", " + name + "_n" return a @@ -598,8 +598,8 @@ def ovectorpair(name, value=None, python_value=None, julia_value=None): " = [ (tmp_" + api_name + "[i], tmp_" + api_name + "[i+1]) " + "for i in 1:2:length(tmp_" + api_name + ") ]") a.fortran_type = "type(c_ptr), intent(out)" - a.fortran_type_post = "\n integer(c_size_t) :: " + name + "_n" - a.fortran_name_post = ",\n & " + name + "_n" + a.fortran_type_post = "\n" + " " * 8 + "integer(c_size_t) :: " + name + "_n" + a.fortran_name_post = ", " + name + "_n" return a @@ -642,9 +642,9 @@ def ovectorvectorint(name, value=None, python_value=None, julia_value=None): "tmp_" + api_name_n + "[i], own = true) for i in 1:" + api_name_nn + "[] ]") a.fortran_type = "type(c_ptr), intent(out)" - a.fortran_type_post = ("\n type(c_ptr), intent(out) :: " + name + - "_n\n integer(c_size_t) :: " + name +"_nn") - a.fortran_name_post = ",\n & " + name + "_n,\n & " + name + "_nn" + a.fortran_type_post = ("\n" + " " * 8 + "type(c_ptr), intent(out) :: " + name + + "_n\n" + " " * 8 + "integer(c_size_t) :: " + name +"_nn") + a.fortran_name_post = ", " + name + "_n," + name + "_nn" return a @@ -687,9 +687,9 @@ def ovectorvectorsize(name, value=None, python_value=None, julia_value=None): "tmp_" + api_name_n + "[i], own = true) for i in 1:" + api_name_nn + "[] ]") a.fortran_type = "type (c_ptr), intent(out)" - a.fortran_type_post = ("\n type(c_ptr), intent(out) :: " + name + - "_n\n integer(c_size_t) :: " + name +"_nn") - a.fortran_name_post = ",\n & " + name + "_n,\n & " + name + "_nn" + a.fortran_type_post = ("\n" + " " * 8 + "type(c_ptr), intent(out) :: " + name + + "_n\n" + " " * 8 + "integer(c_size_t) :: " + name +"_nn") + a.fortran_name_post = ", " + name + "_n," + name + "_nn" return a @@ -733,9 +733,9 @@ def ovectorvectordouble(name, value=None, python_value=None, julia_value=None): "tmp_" + api_name_n + "[i], own = true) for i in 1:" + api_name_nn + "[] ]") a.fortran_type = "type (c_ptr), intent(out)" - a.fortran_type_post = ("\n type(c_ptr), intent(out) :: " + name + - "_n\n integer (c_size_t) :: " + name + "_nn") - a.fortran_name_post = ",\n & " + name + "_n,\n & " + name + "_nn" + a.fortran_type_post = ("\n" + " " * 8 + "type(c_ptr), intent(out) :: " + name + + "_n\n" + " " * 8 + "integer (c_size_t) :: " + name + "_nn") + a.fortran_name_post = ", " + name + "_n," + name + "_nn" return a @@ -783,10 +783,10 @@ def ovectorvectorpair(name, value=None, python_value=None, julia_value=None): api_name + "[i], tmp_" + api_name_n + "[i], own = true)\n " + " " + name + "[i] = [(tmp[i], tmp[i+1]) for i in 1:2:length(tmp)]\n " + "end") - a.fortran_type = "type (C_PTR), intent(out)" - a.fortran_type_post = ("\n type(c_ptr), intent(out) :: " + name + - "_n\n integer (C_SIZE_T) ::" + name +"_nn") - a.fortran_name_post = ",\n & " + name + "_n,\n & " + name + "_nn" + a.fortran_type = "type(c_ptr), intent(out)" + a.fortran_type_post = ("\n" + " " * 8 + "type(c_ptr), intent(out) :: " + name + + "_n\n" + " " * 8 + "integer (C_SIZE_T) ::" + name +"_nn") + a.fortran_name_post = ", " + name + "_n," + name + "_nn" return a @@ -809,7 +809,7 @@ def iargcargv(): a.julia_ctype = "Cint, Ptr{Ptr{Cchar}}" a.julia_arg = "length(argv), argv" a.texi = "(argc = 0)}, @code{argv = []" - a.fortran_name_pre = "argc,\n & " + a.fortran_name_pre = "argc," a.fortran_type = "integer (C_INT), value :: argc\n type (C_PTR)" a.fortran_type_post = "(*)" return a @@ -849,8 +849,8 @@ def isizefun(name): ", Cdouble, (Cint, Cint, Cdouble, Cdouble, Cdouble, Cdouble, Ptr{Cvoid}))") a.julia_arg = "api_" + name + "_, C_NULL" a.julia_ctype = "Ptr{Cvoid}, Ptr{Cvoid}" - a.fortran_type = "type (C_FUNPTR)" - a.fortran_type_post = " ! to do " + a.fortran_type = "type(c_funptr)" + a.fortran_type_post = " ! TODO: Needs implementation" return a @@ -1379,46 +1379,38 @@ julia_header = """# {0} """ -fortran_header = """c -c {0} -c -c See the LICENSE.txt file in the {3} root directory for license information. -c Please report all issues on {1} -c - -!DEC$ IF DEFINED ({2}F_H) -!DEC$ ELSE -!DEC$ DEFINE {2}F_H - -c -c This file defines the {3} Fortran API (v{4}.{5}.{6}). -c -c Do not edit this file directly: it is automatically generated by `api/gen.py'. -c -c By design, the {3} Fortran API is purely functional, and only uses elementary -c Fortran types. See `tutorials/fortran' and `examples/api' for tutorials and -c examples. -c - -!DEC$ DEFINE {2}_API_VERSION_MAJOR = {4} -!DEC$ DEFINE {2}_API_VERSION_MINOR = {5} -!DEC$ DEFINE {2}_API_VERSION_PATCH = {6} - - module gmsh_fortran - - use, intrinsic :: iso_c_binding - - character(len = 5), parameter :: {2}_API_VERSION = "{4}.{5}.{6}" - real(c_double), parameter::M_PI = 3.14159265358979323846d0 - - interface +fortran_header = """! +! {0} +! +! See the LICENSE.txt file in the {3} root directory for license information. +! Please report all issues on {1} +! +! +! This file defines the {3} Fortran API (v{4}.{5}.{6}). +! +! Do not edit this file directly: it is automatically generated by `api/gen.py'. +! +! By design, the {3} Fortran API is purely functional, and only uses elementary +! Fortran types. See `tutorials/fortran' and `examples/api' for tutorials and +! examples. +! + +module gmsh + + use, intrinsic :: iso_c_binding + + integer, parameter :: {2}_API_VERSION_MAJOR = {4} + integer, parameter :: {2}_API_VERSION_MINOR = {5} + integer, parameter :: {2}_API_VERSION_PATCH = {6} + character(len=100), parameter :: {2}_API_VERSION = "{4}.{5}.{6}" + real(c_double), parameter::M_PI = 3.14159265358979323846d0 + + interface """ fortran_footer = """ - end interface - end module gmsh_fortran - -!DEC$ ENDIF + end interface +end module gmsh """ @@ -1867,55 +1859,35 @@ class API: indent += " " for rtype, name, args, doc, special in module.fs: - # *f.h fname = c_namespace + name[0].upper() + name[1:] - -# output doc - self.fwrite( - f, - "\n! " + "\n! ".join(textwrap.wrap(doc, 75)) + "\n") + tab = " " * 4 + # Documentation (Doxygen) + self.fwrite(f, "\n" + tab + "!> " + ("\n" + tab + "!! ").join(textwrap.wrap(doc, 75)) + "\n") fnameapi = "! " + ns.upper() + "_API " + (rtype.rc_type if rtype else "void") + " " + fname + "(" self.flog('f', cpp_namespace.replace('::', '/') + name) - if (len(fname) < 45) : - -# output fortran header - fnamef = ' '*8 + ("function" if rtype else "subroutine") + ' ' + fname + "(" - self.fwrite( - f, fnamef + "\n & " + (",\n & ").join( - list((a.fortran_name_pre + a.name + a.fortran_name_post for a in args + (oint("ierr"), )))) + ")\n") - - left = " " - self.fwrite( - f, - " & bind(C, name = \"" + fname + "\")" + "\n") - self.fwrite( - f, - left + "use, intrinsic :: iso_c_binding" + "\n") - if rtype : - self.fwrite( - f, - left + (rtype.fortran_type) + "::" + fname + "\n") - - self.fwrite( - f, ("").join( - list(( left + " " + a.fortran_type + "::" - + a.name + a.fortran_type_post - + "\n" for a in args + (oint("ierr"), ) )) - ) - ) - - self.fwrite( - f, - left + "end " + ("function" if rtype else "subroutine") - + " " + fname + "\n") + # Procedure definition + fnamef = tab + ("function" if rtype else "subroutine") + " " + fname + "(" + # Procedure name and Argument list + self.fwrite(f, fnamef + (", ").join( + list((a.fortran_name_pre + a.name + a.fortran_name_post for a in args + (oint("ierr"), )))) + ")") + # C interoperability + self.fwrite(f, " bind(C, name=\"" + fname + "\")" + "\n") + self.fwrite(f, tab*2 + "use, intrinsic :: iso_c_binding" + "\n") + # Return variable definition + if rtype : + self.fwrite(f, tab*2 + rtype.fortran_type + " :: " + fname + "\n") + # Variable defintions + self.fwrite(f, "".join(list(( tab*2 + a.fortran_type + " :: " + a.name + a.fortran_type_post + "\n" for a in args + (oint("ierr"), ) )))) + # Procedure end + self.fwrite(f, tab + "end " + ("function" if rtype else "subroutine") + " " + fname + "\n") for m in module.submodules: write_module(m, c_namespace, cpp_namespace, indent) self.current_lineno = 1 - with open(ns + "f.h", "w") as f: + with open(ns + ".f90", "w") as f: self.fwrite( f, fortran_header.format(self.copyright, self.issues, diff --git a/api/gen.py b/api/gen.py index 1483f8cc8b3d48cdd4bbb965fbbc65632afaba82..225d0839fd1e34cd29b4dbdfe21acdec0e156b85 100644 --- a/api/gen.py +++ b/api/gen.py @@ -13,12 +13,13 @@ # - gmsh.h_cwrap: the Gmsh C++ API redefined in terms of the C API # - gmsh.py: the Gmsh Python API module # - gmsh.jl: the Gmsh Julia API module +# - gmsh.f90: the Gmsh Fortran API module # - api.texi: the texinfo API documentation # # By design, the Gmsh API is purely functional, and only uses elementary types # from the target language. # -# See `tutorials/{c++,c,python,julia}' and `examples/api' for tutorials and +# See `tutorials/{c++,c,python,julia,fortran}' and `examples/api' for tutorials and # examples on how to use the Gmsh API. import os diff --git a/api/gmsh.f90 b/api/gmsh.f90 new file mode 100644 index 0000000000000000000000000000000000000000..10d92b66a2d2b2dd6ccf4a9dd207d55baed68f79 --- /dev/null +++ b/api/gmsh.f90 @@ -0,0 +1,4870 @@ +! +! Gmsh - Copyright (C) 1997-2022 C. Geuzaine, J.-F. Remacle +! +! See the LICENSE.txt file in the Gmsh root directory for license information. +! Please report all issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +! +! +! This file defines the Gmsh Fortran API (v4.10.4). +! +! Do not edit this file directly: it is automatically generated by `api/gen.py'. +! +! By design, the Gmsh Fortran API is purely functional, and only uses elementary +! Fortran types. See `tutorials/fortran' and `examples/api' for tutorials and +! examples. +! + +module gmsh + + use, intrinsic :: iso_c_binding + + integer, parameter :: GMSH_API_VERSION_MAJOR = 4 + integer, parameter :: GMSH_API_VERSION_MINOR = 10 + integer, parameter :: GMSH_API_VERSION_PATCH = 4 + ! TODO: the len= is problematic + character(len = 100), parameter :: GMSH_API_VERSION = "4.10.4" + real(c_double), parameter::M_PI = 3.14159265358979323846d0 + + interface + + !> Initialize the Gmsh API. This must be called before any call to the other + !! functions in the API. If `argc' and `argv' (or just `argv' in Python or + !! Julia) are provided, they will be handled in the same way as the command + !! line arguments in the Gmsh app. If `readConfigFiles' is set, read system + !! Gmsh configuration files (gmshrc and gmsh-options). If `run' is set, run in + !! the same way as the Gmsh app, either interactively or in batch mode + !! depending on the command line arguments. If `run' is not set, initializing + !! the API sets the options "General.AbortOnError" to 2 and "General.Terminal" + !! to 1. If compiled with OpenMP support, it also sets the number of threads + !! to "General.NumThreads". + subroutine gmshInitialize(argc,argv, readConfigFiles, run, ierr) bind(C, name="gmshInitialize") + use, intrinsic :: iso_c_binding + integer (C_INT), value :: argc + type (C_PTR) :: argv(*) + integer(c_int), value :: readConfigFiles + integer(c_int), value :: run + integer(c_int) :: ierr + end subroutine gmshInitialize + + !> Return 1 if the Gmsh API is initialized, and 0 if not. + function gmshIsInitialized(ierr) bind(C, name="gmshIsInitialized") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshIsInitialized + integer(c_int) :: ierr + end function gmshIsInitialized + + !> Finalize the Gmsh API. This must be called when you are done using the Gmsh + !! API. + subroutine gmshFinalize(ierr) bind(C, name="gmshFinalize") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshFinalize + + !> Open a file. Equivalent to the `File->Open' menu in the Gmsh app. Handling + !! of the file depends on its extension and/or its contents: opening a file + !! with model data will create a new model. + subroutine gmshOpen(fileName, ierr) bind(C, name="gmshOpen") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: fileName(*) + integer(c_int) :: ierr + end subroutine gmshOpen + + !> Merge a file. Equivalent to the `File->Merge' menu in the Gmsh app. + !! Handling of the file depends on its extension and/or its contents. Merging + !! a file with model data will add the data to the current model. + subroutine gmshMerge(fileName, ierr) bind(C, name="gmshMerge") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: fileName(*) + integer(c_int) :: ierr + end subroutine gmshMerge + + !> Write a file. The export format is determined by the file extension. + subroutine gmshWrite(fileName, ierr) bind(C, name="gmshWrite") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: fileName(*) + integer(c_int) :: ierr + end subroutine gmshWrite + + !> Clear all loaded models and post-processing data, and add a new empty + !! model. + subroutine gmshClear(ierr) bind(C, name="gmshClear") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshClear + + !> Set a numerical option to `value'. `name' is of the form "Category.Option" + !! or "Category[num].Option". Available categories and options are listed in + !! the Gmsh reference manual. + subroutine gmshOptionSetNumber(name, value, ierr) bind(C, name="gmshOptionSetNumber") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + real(c_double), value :: value + integer(c_int) :: ierr + end subroutine gmshOptionSetNumber + + !> Get the `value' of a numerical option. `name' is of the form + !! "Category.Option" or "Category[num].Option". Available categories and + !! options are listed in the Gmsh reference manual. + subroutine gmshOptionGetNumber(name, value, ierr) bind(C, name="gmshOptionGetNumber") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + real(c_double) :: value + integer(c_int) :: ierr + end subroutine gmshOptionGetNumber + + !> Set a string option to `value'. `name' is of the form "Category.Option" or + !! "Category[num].Option". Available categories and options are listed in the + !! Gmsh reference manual. + subroutine gmshOptionSetString(name, value, ierr) bind(C, name="gmshOptionSetString") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + character(len=1, kind=c_char) :: value(*) + integer(c_int) :: ierr + end subroutine gmshOptionSetString + + !> Get the `value' of a string option. `name' is of the form "Category.Option" + !! or "Category[num].Option". Available categories and options are listed in + !! the Gmsh reference manual. + subroutine gmshOptionGetString(name, value, ierr) bind(C, name="gmshOptionGetString") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + type(c_ptr) :: value(*) + integer(c_int) :: ierr + end subroutine gmshOptionGetString + + !> Set a color option to the RGBA value (`r', `g', `b', `a'), where where `r', + !! `g', `b' and `a' should be integers between 0 and 255. `name' is of the + !! form "Category.Color.Option" or "Category[num].Color.Option". Available + !! categories and options are listed in the Gmsh reference manual. For + !! conciseness "Color." can be ommitted in `name'. + subroutine gmshOptionSetColor(name, r, g, b, a, ierr) bind(C, name="gmshOptionSetColor") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + integer(c_int), value :: r + integer(c_int), value :: g + integer(c_int), value :: b + integer(c_int), value :: a + integer(c_int) :: ierr + end subroutine gmshOptionSetColor + + !> Get the `r', `g', `b', `a' value of a color option. `name' is of the form + !! "Category.Color.Option" or "Category[num].Color.Option". Available + !! categories and options are listed in the Gmsh reference manual. For + !! conciseness "Color." can be ommitted in `name'. + subroutine gmshOptionGetColor(name, r, g, b, a, ierr) bind(C, name="gmshOptionGetColor") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + integer(c_int) :: r + integer(c_int) :: g + integer(c_int) :: b + integer(c_int) :: a + integer(c_int) :: ierr + end subroutine gmshOptionGetColor + + !> Add a new model, with name `name', and set it as the current model. + subroutine gmshModelAdd(name, ierr) bind(C, name="gmshModelAdd") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + integer(c_int) :: ierr + end subroutine gmshModelAdd + + !> Remove the current model. + subroutine gmshModelRemove(ierr) bind(C, name="gmshModelRemove") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshModelRemove + + !> List the names of all models. + subroutine gmshModelList(names, names_n, ierr) bind(C, name="gmshModelList") + use, intrinsic :: iso_c_binding + type(c_ptr), intent(out) :: names + integer(c_size_t) :: names_n + integer(c_int) :: ierr + end subroutine gmshModelList + + !> Get the name of the current model. + subroutine gmshModelGetCurrent(name, ierr) bind(C, name="gmshModelGetCurrent") + use, intrinsic :: iso_c_binding + type(c_ptr) :: name(*) + integer(c_int) :: ierr + end subroutine gmshModelGetCurrent + + !> Set the current model to the model with name `name'. If several models have + !! the same name, select the one that was added first. + subroutine gmshModelSetCurrent(name, ierr) bind(C, name="gmshModelSetCurrent") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + integer(c_int) :: ierr + end subroutine gmshModelSetCurrent + + !> Get the file name (if any) associated with the current model. A file name + !! is associated when a model is read from a file on disk. + subroutine gmshModelGetFileName(fileName, ierr) bind(C, name="gmshModelGetFileName") + use, intrinsic :: iso_c_binding + type(c_ptr) :: fileName(*) + integer(c_int) :: ierr + end subroutine gmshModelGetFileName + + !> Set the file name associated with the current model. + subroutine gmshModelSetFileName(fileName, ierr) bind(C, name="gmshModelSetFileName") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: fileName(*) + integer(c_int) :: ierr + end subroutine gmshModelSetFileName + + !> Get all the entities in the current model. If `dim' is >= 0, return only + !! the entities of the specified dimension (e.g. points if `dim' == 0). The + !! entities are returned as a vector of (dim, tag) integer pairs. + subroutine gmshModelGetEntities(dimTags, dimTags_n, dim, ierr) bind(C, name="gmshModelGetEntities") + use, intrinsic :: iso_c_binding + type(c_ptr), intent(out) :: dimTags + integer(c_size_t) :: dimTags_n + integer(c_int), value :: dim + integer(c_int) :: ierr + end subroutine gmshModelGetEntities + + !> Set the name of the entity of dimension `dim' and tag `tag'. + subroutine gmshModelSetEntityName(dim, tag, name, ierr) bind(C, name="gmshModelSetEntityName") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + character(len=1, kind=c_char) :: name(*) + integer(c_int) :: ierr + end subroutine gmshModelSetEntityName + + !> Get the name of the entity of dimension `dim' and tag `tag'. + subroutine gmshModelGetEntityName(dim, tag, name, ierr) bind(C, name="gmshModelGetEntityName") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + type(c_ptr) :: name(*) + integer(c_int) :: ierr + end subroutine gmshModelGetEntityName + + !> Get all the physical groups in the current model. If `dim' is >= 0, return + !! only the entities of the specified dimension (e.g. physical points if `dim' + !! == 0). The entities are returned as a vector of (dim, tag) integer pairs. + subroutine gmshModelGetPhysicalGroups(dimTags, dimTags_n, dim, ierr) bind(C, name="gmshModelGetPhysicalGroups") + use, intrinsic :: iso_c_binding + type(c_ptr), intent(out) :: dimTags + integer(c_size_t) :: dimTags_n + integer(c_int), value :: dim + integer(c_int) :: ierr + end subroutine gmshModelGetPhysicalGroups + + !> Get the tags of the model entities making up the physical group of + !! dimension `dim' and tag `tag'. + subroutine gmshModelGetEntitiesForPhysicalGroup(dim, tag, tags, tags_n, ierr) bind(C, name="gmshModelGetEntitiesForPhysicalGroup") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + type(c_ptr), intent(out) :: tags + integer(c_size_t) :: tags_n + integer(c_int) :: ierr + end subroutine gmshModelGetEntitiesForPhysicalGroup + + !> Get the tags of the physical groups (if any) to which the model entity of + !! dimension `dim' and tag `tag' belongs. + subroutine gmshModelGetPhysicalGroupsForEntity(dim, tag, physicalTags, physicalTags_n, ierr) bind(C, name="gmshModelGetPhysicalGroupsForEntity") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + type(c_ptr), intent(out) :: physicalTags + integer(c_size_t) :: physicalTags_n + integer(c_int) :: ierr + end subroutine gmshModelGetPhysicalGroupsForEntity + + !> Add a physical group of dimension `dim', grouping the model entities with + !! tags `tags'. Return the tag of the physical group, equal to `tag' if `tag' + !! is positive, or a new tag if `tag' < 0. Set the name of the physical group + !! if `name' is not empty. + function gmshModelAddPhysicalGroup(dim, tags, tags_n, tag, name, ierr) bind(C, name="gmshModelAddPhysicalGroup") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelAddPhysicalGroup + integer(c_int), value :: dim + integer(c_int) :: tags(*) + integer(c_size_t), value :: tags_n + integer(c_int), value :: tag + character(len=1, kind=c_char) :: name(*) + integer(c_int) :: ierr + end function gmshModelAddPhysicalGroup + + !> Remove the physical groups `dimTags' from the current model. If `dimTags' + !! is empty, remove all groups. + subroutine gmshModelRemovePhysicalGroups(dimTags, dimTags_n, ierr) bind(C, name="gmshModelRemovePhysicalGroups") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int) :: ierr + end subroutine gmshModelRemovePhysicalGroups + + !> Set the name of the physical group of dimension `dim' and tag `tag'. + subroutine gmshModelSetPhysicalName(dim, tag, name, ierr) bind(C, name="gmshModelSetPhysicalName") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + character(len=1, kind=c_char) :: name(*) + integer(c_int) :: ierr + end subroutine gmshModelSetPhysicalName + + !> Remove the physical name `name' from the current model. + subroutine gmshModelRemovePhysicalName(name, ierr) bind(C, name="gmshModelRemovePhysicalName") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + integer(c_int) :: ierr + end subroutine gmshModelRemovePhysicalName + + !> Get the name of the physical group of dimension `dim' and tag `tag'. + subroutine gmshModelGetPhysicalName(dim, tag, name, ierr) bind(C, name="gmshModelGetPhysicalName") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + type(c_ptr) :: name(*) + integer(c_int) :: ierr + end subroutine gmshModelGetPhysicalName + + !> Set the tag of the entity of dimension `dim' and tag `tag' to the new value + !! `newTag'. + subroutine gmshModelSetTag(dim, tag, newTag, ierr) bind(C, name="gmshModelSetTag") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int), value :: newTag + integer(c_int) :: ierr + end subroutine gmshModelSetTag + + !> Get the boundary of the model entities `dimTags'. Return in `outDimTags' + !! the boundary of the individual entities (if `combined' is false) or the + !! boundary of the combined geometrical shape formed by all input entities (if + !! `combined' is true). Return tags multiplied by the sign of the boundary + !! entity if `oriented' is true. Apply the boundary operator recursively down + !! to dimension 0 (i.e. to points) if `recursive' is true. + subroutine gmshModelGetBoundary(dimTags, dimTags_n, outDimTags, outDimTags_n, combined, oriented, recursive, ierr) bind(C, name="gmshModelGetBoundary") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + integer(c_int), value :: combined + integer(c_int), value :: oriented + integer(c_int), value :: recursive + integer(c_int) :: ierr + end subroutine gmshModelGetBoundary + + !> Get the upward and downward adjacencies of the model entity of dimension + !! `dim' and tag `tag'. The `upward' vector returns the adjacent entities of + !! dimension `dim' + 1; the `downward' vector returns the adjacent entities of + !! dimension `dim' - 1. + subroutine gmshModelGetAdjacencies(dim, tag, upward, upward_n, downward, downward_n, ierr) bind(C, name="gmshModelGetAdjacencies") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + type(c_ptr), intent(out) :: upward + integer(c_size_t) :: upward_n + type(c_ptr), intent(out) :: downward + integer(c_size_t) :: downward_n + integer(c_int) :: ierr + end subroutine gmshModelGetAdjacencies + + !> Get the model entities in the bounding box defined by the two points + !! (`xmin', `ymin', `zmin') and (`xmax', `ymax', `zmax'). If `dim' is >= 0, + !! return only the entities of the specified dimension (e.g. points if `dim' + !! == 0). + subroutine gmshModelGetEntitiesInBoundingBox(xmin, ymin, zmin, xmax, ymax, zmax, tags, tags_n, dim, ierr) bind(C, name="gmshModelGetEntitiesInBoundingBox") + use, intrinsic :: iso_c_binding + real(c_double), value :: xmin + real(c_double), value :: ymin + real(c_double), value :: zmin + real(c_double), value :: xmax + real(c_double), value :: ymax + real(c_double), value :: zmax + type(c_ptr), intent(out) :: tags + integer(c_size_t) :: tags_n + integer(c_int), value :: dim + integer(c_int) :: ierr + end subroutine gmshModelGetEntitiesInBoundingBox + + !> Get the bounding box (`xmin', `ymin', `zmin'), (`xmax', `ymax', `zmax') of + !! the model entity of dimension `dim' and tag `tag'. If `dim' and `tag' are + !! negative, get the bounding box of the whole model. + subroutine gmshModelGetBoundingBox(dim, tag, xmin, ymin, zmin, xmax, ymax, zmax, ierr) bind(C, name="gmshModelGetBoundingBox") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + real(c_double) :: xmin + real(c_double) :: ymin + real(c_double) :: zmin + real(c_double) :: xmax + real(c_double) :: ymax + real(c_double) :: zmax + integer(c_int) :: ierr + end subroutine gmshModelGetBoundingBox + + !> Return the geometrical dimension of the current model. + function gmshModelGetDimension(ierr) bind(C, name="gmshModelGetDimension") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGetDimension + integer(c_int) :: ierr + end function gmshModelGetDimension + + !> Add a discrete model entity (defined by a mesh) of dimension `dim' in the + !! current model. Return the tag of the new discrete entity, equal to `tag' if + !! `tag' is positive, or a new tag if `tag' < 0. `boundary' specifies the tags + !! of the entities on the boundary of the discrete entity, if any. Specifying + !! `boundary' allows Gmsh to construct the topology of the overall model. + function gmshModelAddDiscreteEntity(dim, tag, boundary, boundary_n, ierr) bind(C, name="gmshModelAddDiscreteEntity") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelAddDiscreteEntity + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int) :: boundary(*) + integer(c_size_t), value :: boundary_n + integer(c_int) :: ierr + end function gmshModelAddDiscreteEntity + + !> Remove the entities `dimTags' of the current model, provided that they are + !! not on the boundary of (or embedded in) higher-dimensional entities. If + !! `recursive' is true, remove all the entities on their boundaries, down to + !! dimension 0. + subroutine gmshModelRemoveEntities(dimTags, dimTags_n, recursive, ierr) bind(C, name="gmshModelRemoveEntities") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int), value :: recursive + integer(c_int) :: ierr + end subroutine gmshModelRemoveEntities + + !> Remove the entity name `name' from the current model. + subroutine gmshModelRemoveEntityName(name, ierr) bind(C, name="gmshModelRemoveEntityName") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + integer(c_int) :: ierr + end subroutine gmshModelRemoveEntityName + + !> Get the type of the entity of dimension `dim' and tag `tag'. + subroutine gmshModelGetType(dim, tag, entityType, ierr) bind(C, name="gmshModelGetType") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + type(c_ptr) :: entityType(*) + integer(c_int) :: ierr + end subroutine gmshModelGetType + + !> In a partitioned model, get the parent of the entity of dimension `dim' and + !! tag `tag', i.e. from which the entity is a part of, if any. `parentDim' and + !! `parentTag' are set to -1 if the entity has no parent. + subroutine gmshModelGetParent(dim, tag, parentDim, parentTag, ierr) bind(C, name="gmshModelGetParent") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int) :: parentDim + integer(c_int) :: parentTag + integer(c_int) :: ierr + end subroutine gmshModelGetParent + + !> Return the number of partitions in the model. + function gmshModelGetNumberOfPartitions(ierr) bind(C, name="gmshModelGetNumberOfPartitions") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGetNumberOfPartitions + integer(c_int) :: ierr + end function gmshModelGetNumberOfPartitions + + !> In a partitioned model, return the tags of the partition(s) to which the + !! entity belongs. + subroutine gmshModelGetPartitions(dim, tag, partitions, partitions_n, ierr) bind(C, name="gmshModelGetPartitions") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + type(c_ptr), intent(out) :: partitions + integer(c_size_t) :: partitions_n + integer(c_int) :: ierr + end subroutine gmshModelGetPartitions + + !> Evaluate the parametrization of the entity of dimension `dim' and tag `tag' + !! at the parametric coordinates `parametricCoord'. Only valid for `dim' equal + !! to 0 (with empty `parametricCoord'), 1 (with `parametricCoord' containing + !! parametric coordinates on the curve) or 2 (with `parametricCoord' + !! containing pairs of u, v parametric coordinates on the surface, + !! concatenated: [p1u, p1v, p2u, ...]). Return triplets of x, y, z coordinates + !! in `coord', concatenated: [p1x, p1y, p1z, p2x, ...]. + subroutine gmshModelGetValue(dim, tag, parametricCoord, parametricCoord_n, coord, coord_n, ierr) bind(C, name="gmshModelGetValue") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + real(c_double) :: parametricCoord(*) + integer(c_size_t), value :: parametricCoord_n + type(c_ptr), intent(out) :: coord + integer(c_size_t) :: coord_n + integer(c_int) :: ierr + end subroutine gmshModelGetValue + + !> Evaluate the derivative of the parametrization of the entity of dimension + !! `dim' and tag `tag' at the parametric coordinates `parametricCoord'. Only + !! valid for `dim' equal to 1 (with `parametricCoord' containing parametric + !! coordinates on the curve) or 2 (with `parametricCoord' containing pairs of + !! u, v parametric coordinates on the surface, concatenated: [p1u, p1v, p2u, + !! ...]). For `dim' equal to 1 return the x, y, z components of the derivative + !! with respect to u [d1ux, d1uy, d1uz, d2ux, ...]; for `dim' equal to 2 + !! return the x, y, z components of the derivative with respect to u and v: + !! [d1ux, d1uy, d1uz, d1vx, d1vy, d1vz, d2ux, ...]. + subroutine gmshModelGetDerivative(dim, tag, parametricCoord, parametricCoord_n, derivatives, derivatives_n, ierr) bind(C, name="gmshModelGetDerivative") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + real(c_double) :: parametricCoord(*) + integer(c_size_t), value :: parametricCoord_n + type(c_ptr), intent(out) :: derivatives + integer(c_size_t) :: derivatives_n + integer(c_int) :: ierr + end subroutine gmshModelGetDerivative + + !> Evaluate the second derivative of the parametrization of the entity of + !! dimension `dim' and tag `tag' at the parametric coordinates + !! `parametricCoord'. Only valid for `dim' equal to 1 (with `parametricCoord' + !! containing parametric coordinates on the curve) or 2 (with + !! `parametricCoord' containing pairs of u, v parametric coordinates on the + !! surface, concatenated: [p1u, p1v, p2u, ...]). For `dim' equal to 1 return + !! the x, y, z components of the second derivative with respect to u [d1uux, + !! d1uuy, d1uuz, d2uux, ...]; for `dim' equal to 2 return the x, y, z + !! components of the second derivative with respect to u and v, and the mixed + !! derivative with respect to u and v: [d1uux, d1uuy, d1uuz, d1vvx, d1vvy, + !! d1vvz, d1uvx, d1uvy, d1uvz, d2uux, ...]. + subroutine gmshModelGetSecondDerivative(dim, tag, parametricCoord, parametricCoord_n, derivatives, derivatives_n, ierr) bind(C, name="gmshModelGetSecondDerivative") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + real(c_double) :: parametricCoord(*) + integer(c_size_t), value :: parametricCoord_n + type(c_ptr), intent(out) :: derivatives + integer(c_size_t) :: derivatives_n + integer(c_int) :: ierr + end subroutine gmshModelGetSecondDerivative + + !> Evaluate the (maximum) curvature of the entity of dimension `dim' and tag + !! `tag' at the parametric coordinates `parametricCoord'. Only valid for `dim' + !! equal to 1 (with `parametricCoord' containing parametric coordinates on the + !! curve) or 2 (with `parametricCoord' containing pairs of u, v parametric + !! coordinates on the surface, concatenated: [p1u, p1v, p2u, ...]). + subroutine gmshModelGetCurvature(dim, tag, parametricCoord, parametricCoord_n, curvatures, curvatures_n, ierr) bind(C, name="gmshModelGetCurvature") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + real(c_double) :: parametricCoord(*) + integer(c_size_t), value :: parametricCoord_n + type(c_ptr), intent(out) :: curvatures + integer(c_size_t) :: curvatures_n + integer(c_int) :: ierr + end subroutine gmshModelGetCurvature + + !> Evaluate the principal curvatures of the surface with tag `tag' at the + !! parametric coordinates `parametricCoord', as well as their respective + !! directions. `parametricCoord' are given by pair of u and v coordinates, + !! concatenated: [p1u, p1v, p2u, ...]. + subroutine gmshModelGetPrincipalCurvatures(tag, parametricCoord, parametricCoord_n, curvatureMax, curvatureMax_n, curvatureMin, curvatureMin_n, directionMax, directionMax_n, directionMin, directionMin_n, ierr) bind(C, name="gmshModelGetPrincipalCurvatures") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + real(c_double) :: parametricCoord(*) + integer(c_size_t), value :: parametricCoord_n + type(c_ptr), intent(out) :: curvatureMax + integer(c_size_t) :: curvatureMax_n + type(c_ptr), intent(out) :: curvatureMin + integer(c_size_t) :: curvatureMin_n + type(c_ptr), intent(out) :: directionMax + integer(c_size_t) :: directionMax_n + type(c_ptr), intent(out) :: directionMin + integer(c_size_t) :: directionMin_n + integer(c_int) :: ierr + end subroutine gmshModelGetPrincipalCurvatures + + !> Get the normal to the surface with tag `tag' at the parametric coordinates + !! `parametricCoord'. `parametricCoord' are given by pairs of u and v + !! coordinates, concatenated: [p1u, p1v, p2u, ...]. `normals' are returned as + !! triplets of x, y, z components, concatenated: [n1x, n1y, n1z, n2x, ...]. + subroutine gmshModelGetNormal(tag, parametricCoord, parametricCoord_n, normals, normals_n, ierr) bind(C, name="gmshModelGetNormal") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + real(c_double) :: parametricCoord(*) + integer(c_size_t), value :: parametricCoord_n + type(c_ptr), intent(out) :: normals + integer(c_size_t) :: normals_n + integer(c_int) :: ierr + end subroutine gmshModelGetNormal + + !> Get the parametric coordinates `parametricCoord' for the points `coord' on + !! the entity of dimension `dim' and tag `tag'. `coord' are given as triplets + !! of x, y, z coordinates, concatenated: [p1x, p1y, p1z, p2x, ...]. + !! `parametricCoord' returns the parametric coordinates t on the curve (if + !! `dim' = 1) or pairs of u and v coordinates concatenated on the surface (if + !! `dim' = 2), i.e. [p1t, p2t, ...] or [p1u, p1v, p2u, ...]. + subroutine gmshModelGetParametrization(dim, tag, coord, coord_n, parametricCoord, parametricCoord_n, ierr) bind(C, name="gmshModelGetParametrization") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + real(c_double) :: coord(*) + integer(c_size_t), value :: coord_n + type(c_ptr), intent(out) :: parametricCoord + integer(c_size_t) :: parametricCoord_n + integer(c_int) :: ierr + end subroutine gmshModelGetParametrization + + !> Get the `min' and `max' bounds of the parametric coordinates for the entity + !! of dimension `dim' and tag `tag'. + subroutine gmshModelGetParametrizationBounds(dim, tag, min, min_n, max, max_n, ierr) bind(C, name="gmshModelGetParametrizationBounds") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + type(c_ptr), intent(out) :: min + integer(c_size_t) :: min_n + type(c_ptr), intent(out) :: max + integer(c_size_t) :: max_n + integer(c_int) :: ierr + end subroutine gmshModelGetParametrizationBounds + + !> Check if the coordinates (or the parametric coordinates if `parametric' is + !! set) provided in `coord' correspond to points inside the entity of + !! dimension `dim' and tag `tag', and return the number of points inside. This + !! feature is only available for a subset of entities, depending on the + !! underlying geometrical representation. + function gmshModelIsInside(dim, tag, coord, coord_n, parametric, ierr) bind(C, name="gmshModelIsInside") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelIsInside + integer(c_int), value :: dim + integer(c_int), value :: tag + real(c_double) :: coord(*) + integer(c_size_t), value :: coord_n + integer(c_int), value :: parametric + integer(c_int) :: ierr + end function gmshModelIsInside + + !> Get the points `closestCoord' on the entity of dimension `dim' and tag + !! `tag' to the points `coord', by orthogonal projection. `coord' and + !! `closestCoord' are given as triplets of x, y, z coordinates, concatenated: + !! [p1x, p1y, p1z, p2x, ...]. `parametricCoord' returns the parametric + !! coordinates t on the curve (if `dim' = 1) or pairs of u and v coordinates + !! concatenated on the surface (if `dim' = 2), i.e. [p1t, p2t, ...] or [p1u, + !! p1v, p2u, ...]. + subroutine gmshModelGetClosestPoint(dim, tag, coord, coord_n, closestCoord, closestCoord_n, parametricCoord, parametricCoord_n, ierr) bind(C, name="gmshModelGetClosestPoint") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + real(c_double) :: coord(*) + integer(c_size_t), value :: coord_n + type(c_ptr), intent(out) :: closestCoord + integer(c_size_t) :: closestCoord_n + type(c_ptr), intent(out) :: parametricCoord + integer(c_size_t) :: parametricCoord_n + integer(c_int) :: ierr + end subroutine gmshModelGetClosestPoint + + !> Reparametrize the boundary entity (point or curve, i.e. with `dim' == 0 or + !! `dim' == 1) of tag `tag' on the surface `surfaceTag'. If `dim' == 1, + !! reparametrize all the points corresponding to the parametric coordinates + !! `parametricCoord'. Multiple matches in case of periodic surfaces can be + !! selected with `which'. This feature is only available for a subset of + !! entities, depending on the underlying geometrical representation. + subroutine gmshModelReparametrizeOnSurface(dim, tag, parametricCoord, parametricCoord_n, surfaceTag, surfaceParametricCoord, surfaceParametricCoord_n, which, ierr) bind(C, name="gmshModelReparametrizeOnSurface") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + real(c_double) :: parametricCoord(*) + integer(c_size_t), value :: parametricCoord_n + integer(c_int), value :: surfaceTag + type(c_ptr), intent(out) :: surfaceParametricCoord + integer(c_size_t) :: surfaceParametricCoord_n + integer(c_int), value :: which + integer(c_int) :: ierr + end subroutine gmshModelReparametrizeOnSurface + + !> Set the visibility of the model entities `dimTags' to `value'. Apply the + !! visibility setting recursively if `recursive' is true. + subroutine gmshModelSetVisibility(dimTags, dimTags_n, value, recursive, ierr) bind(C, name="gmshModelSetVisibility") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int), value :: value + integer(c_int), value :: recursive + integer(c_int) :: ierr + end subroutine gmshModelSetVisibility + + !> Get the visibility of the model entity of dimension `dim' and tag `tag'. + subroutine gmshModelGetVisibility(dim, tag, value, ierr) bind(C, name="gmshModelGetVisibility") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int) :: value + integer(c_int) :: ierr + end subroutine gmshModelGetVisibility + + !> Set the global visibility of the model per window to `value', where + !! `windowIndex' identifies the window in the window list. + subroutine gmshModelSetVisibilityPerWindow(value, windowIndex, ierr) bind(C, name="gmshModelSetVisibilityPerWindow") + use, intrinsic :: iso_c_binding + integer(c_int), value :: value + integer(c_int), value :: windowIndex + integer(c_int) :: ierr + end subroutine gmshModelSetVisibilityPerWindow + + !> Set the color of the model entities `dimTags' to the RGBA value (`r', `g', + !! `b', `a'), where `r', `g', `b' and `a' should be integers between 0 and + !! 255. Apply the color setting recursively if `recursive' is true. + subroutine gmshModelSetColor(dimTags, dimTags_n, r, g, b, a, recursive, ierr) bind(C, name="gmshModelSetColor") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int), value :: r + integer(c_int), value :: g + integer(c_int), value :: b + integer(c_int), value :: a + integer(c_int), value :: recursive + integer(c_int) :: ierr + end subroutine gmshModelSetColor + + !> Get the color of the model entity of dimension `dim' and tag `tag'. + subroutine gmshModelGetColor(dim, tag, r, g, b, a, ierr) bind(C, name="gmshModelGetColor") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int) :: r + integer(c_int) :: g + integer(c_int) :: b + integer(c_int) :: a + integer(c_int) :: ierr + end subroutine gmshModelGetColor + + !> Set the `x', `y', `z' coordinates of a geometrical point. + subroutine gmshModelSetCoordinates(tag, x, y, z, ierr) bind(C, name="gmshModelSetCoordinates") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + integer(c_int) :: ierr + end subroutine gmshModelSetCoordinates + + !> Generate a mesh of the current model, up to dimension `dim' (0, 1, 2 or 3). + subroutine gmshModelMeshGenerate(dim, ierr) bind(C, name="gmshModelMeshGenerate") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int) :: ierr + end subroutine gmshModelMeshGenerate + + !> Partition the mesh of the current model into `numPart' partitions. + !! Optionally, `elementTags' and `partitions' can be provided to specify the + !! partition of each element explicitly. + subroutine gmshModelMeshPartition(numPart, elementTags, elementTags_n, partitions, partitions_n, ierr) bind(C, name="gmshModelMeshPartition") + use, intrinsic :: iso_c_binding + integer(c_int), value :: numPart + integer(c_size_t) :: elementTags(*) + integer(c_size_t), value :: elementTags_n + integer(c_int) :: partitions(*) + integer(c_size_t), value :: partitions_n + integer(c_int) :: ierr + end subroutine gmshModelMeshPartition + + !> Unpartition the mesh of the current model. + subroutine gmshModelMeshUnpartition(ierr) bind(C, name="gmshModelMeshUnpartition") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshModelMeshUnpartition + + !> Optimize the mesh of the current model using `method' (empty for default + !! tetrahedral mesh optimizer, "Netgen" for Netgen optimizer, "HighOrder" for + !! direct high-order mesh optimizer, "HighOrderElastic" for high-order elastic + !! smoother, "HighOrderFastCurving" for fast curving algorithm, "Laplace2D" + !! for Laplace smoothing, "Relocate2D" and "Relocate3D" for node relocation, + !! "QuadQuasiStructured" for quad mesh optimization, "UntangleMeshGeometry" + !! for untangling). If `force' is set apply the optimization also to discrete + !! entities. If `dimTags' is given, only apply the optimizer to the given + !! entities. + subroutine gmshModelMeshOptimize(method, force, niter, dimTags, dimTags_n, ierr) bind(C, name="gmshModelMeshOptimize") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: method(*) + integer(c_int), value :: force + integer(c_int), value :: niter + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshOptimize + + !> Recombine the mesh of the current model. + subroutine gmshModelMeshRecombine(ierr) bind(C, name="gmshModelMeshRecombine") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshModelMeshRecombine + + !> Refine the mesh of the current model by uniformly splitting the elements. + subroutine gmshModelMeshRefine(ierr) bind(C, name="gmshModelMeshRefine") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshModelMeshRefine + + !> Set the order of the elements in the mesh of the current model to `order'. + subroutine gmshModelMeshSetOrder(order, ierr) bind(C, name="gmshModelMeshSetOrder") + use, intrinsic :: iso_c_binding + integer(c_int), value :: order + integer(c_int) :: ierr + end subroutine gmshModelMeshSetOrder + + !> Get the last entities (if any) where a meshing error occurred. Currently + !! only populated by the new 3D meshing algorithms. + subroutine gmshModelMeshGetLastEntityError(dimTags, dimTags_n, ierr) bind(C, name="gmshModelMeshGetLastEntityError") + use, intrinsic :: iso_c_binding + type(c_ptr), intent(out) :: dimTags + integer(c_size_t) :: dimTags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshGetLastEntityError + + !> Get the last nodes (if any) where a meshing error occurred. Currently only + !! populated by the new 3D meshing algorithms. + subroutine gmshModelMeshGetLastNodeError(nodeTags, nodeTags_n, ierr) bind(C, name="gmshModelMeshGetLastNodeError") + use, intrinsic :: iso_c_binding + type(c_ptr), intent(out) :: nodeTags + integer(c_size_t) :: nodeTags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshGetLastNodeError + + !> Clear the mesh, i.e. delete all the nodes and elements, for the entities + !! `dimTags'. If `dimTags' is empty, clear the whole mesh. Note that the mesh + !! of an entity can only be cleared if this entity is not on the boundary of + !! another entity with a non-empty mesh. + subroutine gmshModelMeshClear(dimTags, dimTags_n, ierr) bind(C, name="gmshModelMeshClear") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshClear + + !> Reverse the orientation of the elements in the entities `dimTags'. If + !! `dimTags' is empty, reverse the orientation of the elements in the whole + !! mesh. + subroutine gmshModelMeshReverse(dimTags, dimTags_n, ierr) bind(C, name="gmshModelMeshReverse") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshReverse + + !> Apply the affine transformation `affineTransform' (16 entries of a 4x4 + !! matrix, by row; only the 12 first can be provided for convenience) to the + !! coordinates of the nodes classified on the entities `dimTags'. If `dimTags' + !! is empty, transform all the nodes in the mesh. + subroutine gmshModelMeshAffineTransform(affineTransform, affineTransform_n, dimTags, dimTags_n, ierr) bind(C, name="gmshModelMeshAffineTransform") + use, intrinsic :: iso_c_binding + real(c_double) :: affineTransform(*) + integer(c_size_t), value :: affineTransform_n + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshAffineTransform + + !> Get the nodes classified on the entity of dimension `dim' and tag `tag'. If + !! `tag' < 0, get the nodes for all entities of dimension `dim'. If `dim' and + !! `tag' are negative, get all the nodes in the mesh. `nodeTags' contains the + !! node tags (their unique, strictly positive identification numbers). `coord' + !! is a vector of length 3 times the length of `nodeTags' that contains the x, + !! y, z coordinates of the nodes, concatenated: [n1x, n1y, n1z, n2x, ...]. If + !! `dim' >= 0 and `returnParamtricCoord' is set, `parametricCoord' contains + !! the parametric coordinates ([u1, u2, ...] or [u1, v1, u2, ...]) of the + !! nodes, if available. The length of `parametricCoord' can be 0 or `dim' + !! times the length of `nodeTags'. If `includeBoundary' is set, also return + !! the nodes classified on the boundary of the entity (which will be + !! reparametrized on the entity if `dim' >= 0 in order to compute their + !! parametric coordinates). + subroutine gmshModelMeshGetNodes(nodeTags, nodeTags_n, coord, coord_n, parametricCoord, parametricCoord_n, dim, tag, includeBoundary, returnParametricCoord, ierr) bind(C, name="gmshModelMeshGetNodes") + use, intrinsic :: iso_c_binding + type(c_ptr), intent(out) :: nodeTags + integer(c_size_t) :: nodeTags_n + type(c_ptr), intent(out) :: coord + integer(c_size_t) :: coord_n + type(c_ptr), intent(out) :: parametricCoord + integer(c_size_t) :: parametricCoord_n + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int), value :: includeBoundary + integer(c_int), value :: returnParametricCoord + integer(c_int) :: ierr + end subroutine gmshModelMeshGetNodes + + !> Get the nodes classified on the entity of tag `tag', for all the elements + !! of type `elementType'. The other arguments are treated as in `getNodes'. + subroutine gmshModelMeshGetNodesByElementType(elementType, nodeTags, nodeTags_n, coord, coord_n, parametricCoord, parametricCoord_n, tag, returnParametricCoord, ierr) bind(C, name="gmshModelMeshGetNodesByElementType") + use, intrinsic :: iso_c_binding + integer(c_int), value :: elementType + type(c_ptr), intent(out) :: nodeTags + integer(c_size_t) :: nodeTags_n + type(c_ptr), intent(out) :: coord + integer(c_size_t) :: coord_n + type(c_ptr), intent(out) :: parametricCoord + integer(c_size_t) :: parametricCoord_n + integer(c_int), value :: tag + integer(c_int), value :: returnParametricCoord + integer(c_int) :: ierr + end subroutine gmshModelMeshGetNodesByElementType + + !> Get the coordinates and the parametric coordinates (if any) of the node + !! with tag `tag', as well as the dimension `dim' and tag `tag' of the entity + !! on which the node is classified. This function relies on an internal cache + !! (a vector in case of dense node numbering, a map otherwise); for large + !! meshes accessing nodes in bulk is often preferable. + subroutine gmshModelMeshGetNode(nodeTag, coord, coord_n, parametricCoord, parametricCoord_n, dim, tag, ierr) bind(C, name="gmshModelMeshGetNode") + use, intrinsic :: iso_c_binding + integer(c_size_t), value :: nodeTag + type(c_ptr), intent(out) :: coord + integer(c_size_t) :: coord_n + type(c_ptr), intent(out) :: parametricCoord + integer(c_size_t) :: parametricCoord_n + integer(c_int) :: dim + integer(c_int) :: tag + integer(c_int) :: ierr + end subroutine gmshModelMeshGetNode + + !> Set the coordinates and the parametric coordinates (if any) of the node + !! with tag `tag'. This function relies on an internal cache (a vector in case + !! of dense node numbering, a map otherwise); for large meshes accessing nodes + !! in bulk is often preferable. + subroutine gmshModelMeshSetNode(nodeTag, coord, coord_n, parametricCoord, parametricCoord_n, ierr) bind(C, name="gmshModelMeshSetNode") + use, intrinsic :: iso_c_binding + integer(c_size_t), value :: nodeTag + real(c_double) :: coord(*) + integer(c_size_t), value :: coord_n + real(c_double) :: parametricCoord(*) + integer(c_size_t), value :: parametricCoord_n + integer(c_int) :: ierr + end subroutine gmshModelMeshSetNode + + !> Rebuild the node cache. + subroutine gmshModelMeshRebuildNodeCache(onlyIfNecessary, ierr) bind(C, name="gmshModelMeshRebuildNodeCache") + use, intrinsic :: iso_c_binding + integer(c_int), value :: onlyIfNecessary + integer(c_int) :: ierr + end subroutine gmshModelMeshRebuildNodeCache + + !> Rebuild the element cache. + subroutine gmshModelMeshRebuildElementCache(onlyIfNecessary, ierr) bind(C, name="gmshModelMeshRebuildElementCache") + use, intrinsic :: iso_c_binding + integer(c_int), value :: onlyIfNecessary + integer(c_int) :: ierr + end subroutine gmshModelMeshRebuildElementCache + + !> Get the nodes from all the elements belonging to the physical group of + !! dimension `dim' and tag `tag'. `nodeTags' contains the node tags; `coord' + !! is a vector of length 3 times the length of `nodeTags' that contains the x, + !! y, z coordinates of the nodes, concatenated: [n1x, n1y, n1z, n2x, ...]. + subroutine gmshModelMeshGetNodesForPhysicalGroup(dim, tag, nodeTags, nodeTags_n, coord, coord_n, ierr) bind(C, name="gmshModelMeshGetNodesForPhysicalGroup") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + type(c_ptr), intent(out) :: nodeTags + integer(c_size_t) :: nodeTags_n + type(c_ptr), intent(out) :: coord + integer(c_size_t) :: coord_n + integer(c_int) :: ierr + end subroutine gmshModelMeshGetNodesForPhysicalGroup + + !> Get the maximum tag `maxTag' of a node in the mesh. + subroutine gmshModelMeshGetMaxNodeTag(maxTag, ierr) bind(C, name="gmshModelMeshGetMaxNodeTag") + use, intrinsic :: iso_c_binding + integer(c_size_t) :: maxTag + integer(c_int) :: ierr + end subroutine gmshModelMeshGetMaxNodeTag + + !> Add nodes classified on the model entity of dimension `dim' and tag `tag'. + !! `nodeTags' contains the node tags (their unique, strictly positive + !! identification numbers). `coord' is a vector of length 3 times the length + !! of `nodeTags' that contains the x, y, z coordinates of the nodes, + !! concatenated: [n1x, n1y, n1z, n2x, ...]. The optional `parametricCoord' + !! vector contains the parametric coordinates of the nodes, if any. The length + !! of `parametricCoord' can be 0 or `dim' times the length of `nodeTags'. If + !! the `nodeTags' vector is empty, new tags are automatically assigned to the + !! nodes. + subroutine gmshModelMeshAddNodes(dim, tag, nodeTags, nodeTags_n, coord, coord_n, parametricCoord, parametricCoord_n, ierr) bind(C, name="gmshModelMeshAddNodes") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_size_t) :: nodeTags(*) + integer(c_size_t), value :: nodeTags_n + real(c_double) :: coord(*) + integer(c_size_t), value :: coord_n + real(c_double) :: parametricCoord(*) + integer(c_size_t), value :: parametricCoord_n + integer(c_int) :: ierr + end subroutine gmshModelMeshAddNodes + + !> Reclassify all nodes on their associated model entity, based on the + !! elements. Can be used when importing nodes in bulk (e.g. by associating + !! them all to a single volume), to reclassify them correctly on model + !! surfaces, curves, etc. after the elements have been set. + subroutine gmshModelMeshReclassifyNodes(ierr) bind(C, name="gmshModelMeshReclassifyNodes") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshModelMeshReclassifyNodes + + !> Relocate the nodes classified on the entity of dimension `dim' and tag + !! `tag' using their parametric coordinates. If `tag' < 0, relocate the nodes + !! for all entities of dimension `dim'. If `dim' and `tag' are negative, + !! relocate all the nodes in the mesh. + subroutine gmshModelMeshRelocateNodes(dim, tag, ierr) bind(C, name="gmshModelMeshRelocateNodes") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int) :: ierr + end subroutine gmshModelMeshRelocateNodes + + !> Get the elements classified on the entity of dimension `dim' and tag `tag'. + !! If `tag' < 0, get the elements for all entities of dimension `dim'. If + !! `dim' and `tag' are negative, get all the elements in the mesh. + !! `elementTypes' contains the MSH types of the elements (e.g. `2' for 3-node + !! triangles: see `getElementProperties' to obtain the properties for a given + !! element type). `elementTags' is a vector of the same length as + !! `elementTypes'; each entry is a vector containing the tags (unique, + !! strictly positive identifiers) of the elements of the corresponding type. + !! `nodeTags' is also a vector of the same length as `elementTypes'; each + !! entry is a vector of length equal to the number of elements of the given + !! type times the number N of nodes for this type of element, that contains + !! the node tags of all the elements of the given type, concatenated: [e1n1, + !! e1n2, ..., e1nN, e2n1, ...]. + subroutine gmshModelMeshGetElements(elementTypes, elementTypes_n, elementTags, elementTags_n,elementTags_nn, nodeTags, nodeTags_n,nodeTags_nn, dim, tag, ierr) bind(C, name="gmshModelMeshGetElements") + use, intrinsic :: iso_c_binding + type(c_ptr), intent(out) :: elementTypes + integer(c_size_t) :: elementTypes_n + type (c_ptr), intent(out) :: elementTags + type(c_ptr), intent(out) :: elementTags_n + integer(c_size_t) :: elementTags_nn + type (c_ptr), intent(out) :: nodeTags + type(c_ptr), intent(out) :: nodeTags_n + integer(c_size_t) :: nodeTags_nn + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int) :: ierr + end subroutine gmshModelMeshGetElements + + !> Get the type and node tags of the element with tag `tag', as well as the + !! dimension `dim' and tag `tag' of the entity on which the element is + !! classified. This function relies on an internal cache (a vector in case of + !! dense element numbering, a map otherwise); for large meshes accessing + !! elements in bulk is often preferable. + subroutine gmshModelMeshGetElement(elementTag, elementType, nodeTags, nodeTags_n, dim, tag, ierr) bind(C, name="gmshModelMeshGetElement") + use, intrinsic :: iso_c_binding + integer(c_size_t), value :: elementTag + integer(c_int) :: elementType + type(c_ptr), intent(out) :: nodeTags + integer(c_size_t) :: nodeTags_n + integer(c_int) :: dim + integer(c_int) :: tag + integer(c_int) :: ierr + end subroutine gmshModelMeshGetElement + + !> Search the mesh for an element located at coordinates (`x', `y', `z'). This + !! function performs a search in a spatial octree. If an element is found, + !! return its tag, type and node tags, as well as the local coordinates (`u', + !! `v', `w') within the reference element corresponding to search location. If + !! `dim' is >= 0, only search for elements of the given dimension. If `strict' + !! is not set, use a tolerance to find elements near the search location. + subroutine gmshModelMeshGetElementByCoordinates(x, y, z, elementTag, elementType, nodeTags, nodeTags_n, u, v, w, dim, strict, ierr) bind(C, name="gmshModelMeshGetElementByCoordinates") + use, intrinsic :: iso_c_binding + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + integer(c_size_t) :: elementTag + integer(c_int) :: elementType + type(c_ptr), intent(out) :: nodeTags + integer(c_size_t) :: nodeTags_n + real(c_double) :: u + real(c_double) :: v + real(c_double) :: w + integer(c_int), value :: dim + integer(c_int), value :: strict + integer(c_int) :: ierr + end subroutine gmshModelMeshGetElementByCoordinates + + !> Search the mesh for element(s) located at coordinates (`x', `y', `z'). This + !! function performs a search in a spatial octree. Return the tags of all + !! found elements in `elementTags'. Additional information about the elements + !! can be accessed through `getElement' and `getLocalCoordinatesInElement'. If + !! `dim' is >= 0, only search for elements of the given dimension. If `strict' + !! is not set, use a tolerance to find elements near the search location. + subroutine gmshModelMeshGetElementsByCoordinates(x, y, z, elementTags, elementTags_n, dim, strict, ierr) bind(C, name="gmshModelMeshGetElementsByCoordinates") + use, intrinsic :: iso_c_binding + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + type(c_ptr), intent(out) :: elementTags + integer(c_size_t) :: elementTags_n + integer(c_int), value :: dim + integer(c_int), value :: strict + integer(c_int) :: ierr + end subroutine gmshModelMeshGetElementsByCoordinates + + !> Return the local coordinates (`u', `v', `w') within the element + !! `elementTag' corresponding to the model coordinates (`x', `y', `z'). This + !! function relies on an internal cache (a vector in case of dense element + !! numbering, a map otherwise); for large meshes accessing elements in bulk is + !! often preferable. + subroutine gmshModelMeshGetLocalCoordinatesInElement(elementTag, x, y, z, u, v, w, ierr) bind(C, name="gmshModelMeshGetLocalCoordinatesInElement") + use, intrinsic :: iso_c_binding + integer(c_size_t), value :: elementTag + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + real(c_double) :: u + real(c_double) :: v + real(c_double) :: w + integer(c_int) :: ierr + end subroutine gmshModelMeshGetLocalCoordinatesInElement + + !> Get the types of elements in the entity of dimension `dim' and tag `tag'. + !! If `tag' < 0, get the types for all entities of dimension `dim'. If `dim' + !! and `tag' are negative, get all the types in the mesh. + subroutine gmshModelMeshGetElementTypes(elementTypes, elementTypes_n, dim, tag, ierr) bind(C, name="gmshModelMeshGetElementTypes") + use, intrinsic :: iso_c_binding + type(c_ptr), intent(out) :: elementTypes + integer(c_size_t) :: elementTypes_n + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int) :: ierr + end subroutine gmshModelMeshGetElementTypes + + !> Return an element type given its family name `familyName' ("Point", "Line", + !! "Triangle", "Quadrangle", "Tetrahedron", "Pyramid", "Prism", "Hexahedron") + !! and polynomial order `order'. If `serendip' is true, return the + !! corresponding serendip element type (element without interior nodes). + function gmshModelMeshGetElementType(familyName, order, serendip, ierr) bind(C, name="gmshModelMeshGetElementType") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelMeshGetElementType + character(len=1, kind=c_char) :: familyName(*) + integer(c_int), value :: order + integer(c_int), value :: serendip + integer(c_int) :: ierr + end function gmshModelMeshGetElementType + + !> Get the properties of an element of type `elementType': its name + !! (`elementName'), dimension (`dim'), order (`order'), number of nodes + !! (`numNodes'), local coordinates of the nodes in the reference element + !! (`localNodeCoord' vector, of length `dim' times `numNodes') and number of + !! primary (first order) nodes (`numPrimaryNodes'). + subroutine gmshModelMeshGetElementProperties(elementType, elementName, dim, order, numNodes, localNodeCoord, localNodeCoord_n, numPrimaryNodes, ierr) bind(C, name="gmshModelMeshGetElementProperties") + use, intrinsic :: iso_c_binding + integer(c_int), value :: elementType + type(c_ptr) :: elementName(*) + integer(c_int) :: dim + integer(c_int) :: order + integer(c_int) :: numNodes + type(c_ptr), intent(out) :: localNodeCoord + integer(c_size_t) :: localNodeCoord_n + integer(c_int) :: numPrimaryNodes + integer(c_int) :: ierr + end subroutine gmshModelMeshGetElementProperties + + !> Get the elements of type `elementType' classified on the entity of tag + !! `tag'. If `tag' < 0, get the elements for all entities. `elementTags' is a + !! vector containing the tags (unique, strictly positive identifiers) of the + !! elements of the corresponding type. `nodeTags' is a vector of length equal + !! to the number of elements of the given type times the number N of nodes for + !! this type of element, that contains the node tags of all the elements of + !! the given type, concatenated: [e1n1, e1n2, ..., e1nN, e2n1, ...]. If + !! `numTasks' > 1, only compute and return the part of the data indexed by + !! `task'. + subroutine gmshModelMeshGetElementsByType(elementType, elementTags, elementTags_n, nodeTags, nodeTags_n, tag, task, numTasks, ierr) bind(C, name="gmshModelMeshGetElementsByType") + use, intrinsic :: iso_c_binding + integer(c_int), value :: elementType + type(c_ptr), intent(out) :: elementTags + integer(c_size_t) :: elementTags_n + type(c_ptr), intent(out) :: nodeTags + integer(c_size_t) :: nodeTags_n + integer(c_int), value :: tag + integer(c_size_t), value :: task + integer(c_size_t), value :: numTasks + integer(c_int) :: ierr + end subroutine gmshModelMeshGetElementsByType + + !> Get the maximum tag `maxTag' of an element in the mesh. + subroutine gmshModelMeshGetMaxElementTag(maxTag, ierr) bind(C, name="gmshModelMeshGetMaxElementTag") + use, intrinsic :: iso_c_binding + integer(c_size_t) :: maxTag + integer(c_int) :: ierr + end subroutine gmshModelMeshGetMaxElementTag + + !> Preallocate data before calling `getElementsByType' with `numTasks' > 1. + !! For C and C++ only. + subroutine gmshModelMeshPreallocateElementsByType(elementType, elementTag, nodeTag, elementTags, elementTags_n, nodeTags, nodeTags_n, tag, ierr) bind(C, name="gmshModelMeshPreallocateElementsByType") + use, intrinsic :: iso_c_binding + integer(c_int), value :: elementType + integer(c_int), value :: elementTag + integer(c_int), value :: nodeTag + type(c_ptr), intent(out) :: elementTags + integer(c_size_t) :: elementTags_n + type(c_ptr), intent(out) :: nodeTags + integer(c_size_t) :: nodeTags_n + integer(c_int), value :: tag + integer(c_int) :: ierr + end subroutine gmshModelMeshPreallocateElementsByType + + !> Get the quality `elementQualities' of the elements with tags `elementTags'. + !! `qualityType' is the requested quality measure: "minSJ" for the minimal + !! scaled jacobien, "minSICN" for the minimal signed inverted condition + !! number, "minSIGE" for the signed inverted gradient error, "gamma" for the + !! ratio of the inscribed to circumcribed sphere radius, "volume" for the + !! volume. If `numTasks' > 1, only compute and return the part of the data + !! indexed by `task'. + subroutine gmshModelMeshGetElementQualities(elementTags, elementTags_n, elementsQuality, elementsQuality_n, qualityName, task, numTasks, ierr) bind(C, name="gmshModelMeshGetElementQualities") + use, intrinsic :: iso_c_binding + integer(c_size_t) :: elementTags(*) + integer(c_size_t), value :: elementTags_n + type(c_ptr), intent(out) :: elementsQuality + integer(c_size_t) :: elementsQuality_n + character(len=1, kind=c_char) :: qualityName(*) + integer(c_size_t), value :: task + integer(c_size_t), value :: numTasks + integer(c_int) :: ierr + end subroutine gmshModelMeshGetElementQualities + + !> Add elements classified on the entity of dimension `dim' and tag `tag'. + !! `types' contains the MSH types of the elements (e.g. `2' for 3-node + !! triangles: see the Gmsh reference manual). `elementTags' is a vector of the + !! same length as `types'; each entry is a vector containing the tags (unique, + !! strictly positive identifiers) of the elements of the corresponding type. + !! `nodeTags' is also a vector of the same length as `types'; each entry is a + !! vector of length equal to the number of elements of the given type times + !! the number N of nodes per element, that contains the node tags of all the + !! elements of the given type, concatenated: [e1n1, e1n2, ..., e1nN, e2n1, + !! ...]. + subroutine gmshModelMeshAddElements(dim, tag, elementTypes, elementTypes_n, elementTags, elementTags_n,elementTags_nn, nodeTags, nodeTags_n,nodeTags_nn, ierr) bind(C, name="gmshModelMeshAddElements") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int) :: elementTypes(*) + integer(c_size_t), value :: elementTypes_n + type(c_ptr), intent(out) :: elementTags + type(c_ptr), intent(out) :: elementTags_n + integer(c_size_t) :: elementTags_nn + type(c_ptr), intent(out) :: nodeTags + type(c_ptr), intent(out) :: nodeTags_n + integer(c_size_t) :: nodeTags_nn + integer(c_int) :: ierr + end subroutine gmshModelMeshAddElements + + !> Add elements of type `elementType' classified on the entity of tag `tag'. + !! `elementTags' contains the tags (unique, strictly positive identifiers) of + !! the elements of the corresponding type. `nodeTags' is a vector of length + !! equal to the number of elements times the number N of nodes per element, + !! that contains the node tags of all the elements, concatenated: [e1n1, e1n2, + !! ..., e1nN, e2n1, ...]. If the `elementTag' vector is empty, new tags are + !! automatically assigned to the elements. + subroutine gmshModelMeshAddElementsByType(tag, elementType, elementTags, elementTags_n, nodeTags, nodeTags_n, ierr) bind(C, name="gmshModelMeshAddElementsByType") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + integer(c_int), value :: elementType + integer(c_size_t) :: elementTags(*) + integer(c_size_t), value :: elementTags_n + integer(c_size_t) :: nodeTags(*) + integer(c_size_t), value :: nodeTags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshAddElementsByType + + !> Get the numerical quadrature information for the given element type + !! `elementType' and integration rule `integrationType', where + !! `integrationType' concatenates the integration rule family name with the + !! desired order (e.g. "Gauss4" for a quadrature suited for integrating 4th + !! order polynomials). The "CompositeGauss" family uses tensor-product rules + !! based the 1D Gauss-Legendre rule; the "Gauss" family uses an economic + !! scheme when available (i.e. with a minimal number of points), and falls + !! back to "CompositeGauss" otherwise. Note that integration points for the + !! "Gauss" family can fall outside of the reference element for high-order + !! rules. `localCoord' contains the u, v, w coordinates of the G integration + !! points in the reference element: [g1u, g1v, g1w, ..., gGu, gGv, gGw]. + !! `weights' contains the associated weights: [g1q, ..., gGq]. + subroutine gmshModelMeshGetIntegrationPoints(elementType, integrationType, localCoord, localCoord_n, weights, weights_n, ierr) bind(C, name="gmshModelMeshGetIntegrationPoints") + use, intrinsic :: iso_c_binding + integer(c_int), value :: elementType + character(len=1, kind=c_char) :: integrationType(*) + type(c_ptr), intent(out) :: localCoord + integer(c_size_t) :: localCoord_n + type(c_ptr), intent(out) :: weights + integer(c_size_t) :: weights_n + integer(c_int) :: ierr + end subroutine gmshModelMeshGetIntegrationPoints + + !> Get the Jacobians of all the elements of type `elementType' classified on + !! the entity of tag `tag', at the G evaluation points `localCoord' given as + !! concatenated triplets of coordinates in the reference element [g1u, g1v, + !! g1w, ..., gGu, gGv, gGw]. Data is returned by element, with elements in the + !! same order as in `getElements' and `getElementsByType'. `jacobians' + !! contains for each element the 9 entries of the 3x3 Jacobian matrix at each + !! evaluation point. The matrix is returned by column: [e1g1Jxu, e1g1Jyu, + !! e1g1Jzu, e1g1Jxv, ..., e1g1Jzw, e1g2Jxu, ..., e1gGJzw, e2g1Jxu, ...], with + !! Jxu=dx/du, Jyu=dy/du, etc. `determinants' contains for each element the + !! determinant of the Jacobian matrix at each evaluation point: [e1g1, e1g2, + !! ... e1gG, e2g1, ...]. `coord' contains for each element the x, y, z + !! coordinates of the evaluation points. If `tag' < 0, get the Jacobian data + !! for all entities. If `numTasks' > 1, only compute and return the part of + !! the data indexed by `task'. + subroutine gmshModelMeshGetJacobians(elementType, localCoord, localCoord_n, jacobians, jacobians_n, determinants, determinants_n, coord, coord_n, tag, task, numTasks, ierr) bind(C, name="gmshModelMeshGetJacobians") + use, intrinsic :: iso_c_binding + integer(c_int), value :: elementType + real(c_double) :: localCoord(*) + integer(c_size_t), value :: localCoord_n + type(c_ptr), intent(out) :: jacobians + integer(c_size_t) :: jacobians_n + type(c_ptr), intent(out) :: determinants + integer(c_size_t) :: determinants_n + type(c_ptr), intent(out) :: coord + integer(c_size_t) :: coord_n + integer(c_int), value :: tag + integer(c_size_t), value :: task + integer(c_size_t), value :: numTasks + integer(c_int) :: ierr + end subroutine gmshModelMeshGetJacobians + + !> Preallocate data before calling `getJacobians' with `numTasks' > 1. For C + !! and C++ only. + subroutine gmshModelMeshPreallocateJacobians(elementType, numEvaluationPoints, allocateJacobians, allocateDeterminants, allocateCoord, jacobians, jacobians_n, determinants, determinants_n, coord, coord_n, tag, ierr) bind(C, name="gmshModelMeshPreallocateJacobians") + use, intrinsic :: iso_c_binding + integer(c_int), value :: elementType + integer(c_int), value :: numEvaluationPoints + integer(c_int), value :: allocateJacobians + integer(c_int), value :: allocateDeterminants + integer(c_int), value :: allocateCoord + type(c_ptr), intent(out) :: jacobians + integer(c_size_t) :: jacobians_n + type(c_ptr), intent(out) :: determinants + integer(c_size_t) :: determinants_n + type(c_ptr), intent(out) :: coord + integer(c_size_t) :: coord_n + integer(c_int), value :: tag + integer(c_int) :: ierr + end subroutine gmshModelMeshPreallocateJacobians + + !> Get the Jacobian for a single element `elementTag', at the G evaluation + !! points `localCoord' given as concatenated triplets of coordinates in the + !! reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]. `jacobians' contains + !! the 9 entries of the 3x3 Jacobian matrix at each evaluation point. The + !! matrix is returned by column: [e1g1Jxu, e1g1Jyu, e1g1Jzu, e1g1Jxv, ..., + !! e1g1Jzw, e1g2Jxu, ..., e1gGJzw, e2g1Jxu, ...], with Jxu=dx/du, Jyu=dy/du, + !! etc. `determinants' contains the determinant of the Jacobian matrix at each + !! evaluation point. `coord' contains the x, y, z coordinates of the + !! evaluation points. This function relies on an internal cache (a vector in + !! case of dense element numbering, a map otherwise); for large meshes + !! accessing Jacobians in bulk is often preferable. + subroutine gmshModelMeshGetJacobian(elementTag, localCoord, localCoord_n, jacobians, jacobians_n, determinants, determinants_n, coord, coord_n, ierr) bind(C, name="gmshModelMeshGetJacobian") + use, intrinsic :: iso_c_binding + integer(c_size_t), value :: elementTag + real(c_double) :: localCoord(*) + integer(c_size_t), value :: localCoord_n + type(c_ptr), intent(out) :: jacobians + integer(c_size_t) :: jacobians_n + type(c_ptr), intent(out) :: determinants + integer(c_size_t) :: determinants_n + type(c_ptr), intent(out) :: coord + integer(c_size_t) :: coord_n + integer(c_int) :: ierr + end subroutine gmshModelMeshGetJacobian + + !> Get the basis functions of the element of type `elementType' at the + !! evaluation points `localCoord' (given as concatenated triplets of + !! coordinates in the reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]), + !! for the function space `functionSpaceType'. Currently supported function + !! spaces include "Lagrange" and "GradLagrange" for isoparametric Lagrange + !! basis functions and their gradient in the u, v, w coordinates of the + !! reference element; "LagrangeN" and "GradLagrangeN", with N = 1, 2, ..., for + !! N-th order Lagrange basis functions; "H1LegendreN" and "GradH1LegendreN", + !! with N = 1, 2, ..., for N-th order hierarchical H1 Legendre functions; + !! "HcurlLegendreN" and "CurlHcurlLegendreN", with N = 1, 2, ..., for N-th + !! order curl-conforming basis functions. `numComponents' returns the number C + !! of components of a basis function (e.g. 1 for scalar functions and 3 for + !! vector functions). `basisFunctions' returns the value of the N basis + !! functions at the evaluation points, i.e. [g1f1, g1f2, ..., g1fN, g2f1, ...] + !! when C == 1 or [g1f1u, g1f1v, g1f1w, g1f2u, ..., g1fNw, g2f1u, ...] when C + !! == 3. For basis functions that depend on the orientation of the elements, + !! all values for the first orientation are returned first, followed by values + !! for the second, etc. `numOrientations' returns the overall number of + !! orientations. If `wantedOrientations' is not empty, only return the values + !! for the desired orientation indices. + subroutine gmshModelMeshGetBasisFunctions(elementType, localCoord, localCoord_n, functionSpaceType, numComponents, basisFunctions, basisFunctions_n, numOrientations, wantedOrientations, wantedOrientations_n, ierr) bind(C, name="gmshModelMeshGetBasisFunctions") + use, intrinsic :: iso_c_binding + integer(c_int), value :: elementType + real(c_double) :: localCoord(*) + integer(c_size_t), value :: localCoord_n + character(len=1, kind=c_char) :: functionSpaceType(*) + integer(c_int) :: numComponents + type(c_ptr), intent(out) :: basisFunctions + integer(c_size_t) :: basisFunctions_n + integer(c_int) :: numOrientations + integer(c_int) :: wantedOrientations(*) + integer(c_size_t), value :: wantedOrientations_n + integer(c_int) :: ierr + end subroutine gmshModelMeshGetBasisFunctions + + !> Get the orientation index of the elements of type `elementType' in the + !! entity of tag `tag'. The arguments have the same meaning as in + !! `getBasisFunctions'. `basisFunctionsOrientation' is a vector giving for + !! each element the orientation index in the values returned by + !! `getBasisFunctions'. For Lagrange basis functions the call is superfluous + !! as it will return a vector of zeros. + subroutine gmshModelMeshGetBasisFunctionsOrientation(elementType, functionSpaceType, basisFunctionsOrientation, basisFunctionsOrientation_n, tag, task, numTasks, ierr) bind(C, name="gmshModelMeshGetBasisFunctionsOrientation") + use, intrinsic :: iso_c_binding + integer(c_int), value :: elementType + character(len=1, kind=c_char) :: functionSpaceType(*) + type(c_ptr), intent(out) :: basisFunctionsOrientation + integer(c_size_t) :: basisFunctionsOrientation_n + integer(c_int), value :: tag + integer(c_size_t), value :: task + integer(c_size_t), value :: numTasks + integer(c_int) :: ierr + end subroutine gmshModelMeshGetBasisFunctionsOrientation + + !> Get the orientation of a single element `elementTag'. + subroutine gmshModelMeshGetBasisFunctionsOrientationForElement(elementTag, functionSpaceType, basisFunctionsOrientation, ierr) bind(C, name="gmshModelMeshGetBasisFunctionsOrientationForElement") + use, intrinsic :: iso_c_binding + integer(c_size_t), value :: elementTag + character(len=1, kind=c_char) :: functionSpaceType(*) + integer(c_int) :: basisFunctionsOrientation + integer(c_int) :: ierr + end subroutine gmshModelMeshGetBasisFunctionsOrientationForElement + + !> Get the number of possible orientations for elements of type `elementType' + !! and function space named `functionSpaceType'. + function gmshModelMeshGetNumberOfOrientations(elementType, functionSpaceType, ierr) bind(C, name="gmshModelMeshGetNumberOfOrientations") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelMeshGetNumberOfOrientations + integer(c_int), value :: elementType + character(len=1, kind=c_char) :: functionSpaceType(*) + integer(c_int) :: ierr + end function gmshModelMeshGetNumberOfOrientations + + !> Preallocate data before calling `getBasisFunctionsOrientation' with + !! `numTasks' > 1. For C and C++ only. + subroutine gmshModelMeshPreallocateBasisFunctionsOrientation(elementType, basisFunctionsOrientation, basisFunctionsOrientation_n, tag, ierr) bind(C, name="gmshModelMeshPreallocateBasisFunctionsOrientation") + use, intrinsic :: iso_c_binding + integer(c_int), value :: elementType + type(c_ptr), intent(out) :: basisFunctionsOrientation + integer(c_size_t) :: basisFunctionsOrientation_n + integer(c_int), value :: tag + integer(c_int) :: ierr + end subroutine gmshModelMeshPreallocateBasisFunctionsOrientation + + !> Get the global unique mesh edge identifiers `edgeTags' and orientations + !! `edgeOrientation' for an input list of node tag pairs defining these edges, + !! concatenated in the vector `nodeTags'. Mesh edges are created e.g. by + !! `createEdges()', `getKeys()' or `addEdges()'. The reference positive + !! orientation is n1 < n2, where n1 and n2 are the tags of the two edge nodes, + !! which corresponds to the local orientation of edge-based basis functions as + !! well. + subroutine gmshModelMeshGetEdges(nodeTags, nodeTags_n, edgeTags, edgeTags_n, edgeOrientations, edgeOrientations_n, ierr) bind(C, name="gmshModelMeshGetEdges") + use, intrinsic :: iso_c_binding + integer(c_size_t) :: nodeTags(*) + integer(c_size_t), value :: nodeTags_n + type(c_ptr), intent(out) :: edgeTags + integer(c_size_t) :: edgeTags_n + type(c_ptr), intent(out) :: edgeOrientations + integer(c_size_t) :: edgeOrientations_n + integer(c_int) :: ierr + end subroutine gmshModelMeshGetEdges + + !> Get the global unique mesh face identifiers `faceTags' and orientations + !! `faceOrientations' for an input list of node tag triplets (if `faceType' == + !! 3) or quadruplets (if `faceType' == 4) defining these faces, concatenated + !! in the vector `nodeTags'. Mesh faces are created e.g. by `createFaces()', + !! `getKeys()' or `addFaces()'. + subroutine gmshModelMeshGetFaces(faceType, nodeTags, nodeTags_n, faceTags, faceTags_n, faceOrientations, faceOrientations_n, ierr) bind(C, name="gmshModelMeshGetFaces") + use, intrinsic :: iso_c_binding + integer(c_int), value :: faceType + integer(c_size_t) :: nodeTags(*) + integer(c_size_t), value :: nodeTags_n + type(c_ptr), intent(out) :: faceTags + integer(c_size_t) :: faceTags_n + type(c_ptr), intent(out) :: faceOrientations + integer(c_size_t) :: faceOrientations_n + integer(c_int) :: ierr + end subroutine gmshModelMeshGetFaces + + !> Create unique mesh edges for the entities `dimTags'. + subroutine gmshModelMeshCreateEdges(dimTags, dimTags_n, ierr) bind(C, name="gmshModelMeshCreateEdges") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshCreateEdges + + !> Create unique mesh faces for the entities `dimTags'. + subroutine gmshModelMeshCreateFaces(dimTags, dimTags_n, ierr) bind(C, name="gmshModelMeshCreateFaces") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshCreateFaces + + !> Get the global unique identifiers `edgeTags' and the nodes `edgeNodes' of + !! the edges in the mesh. Mesh edges are created e.g. by `createEdges()', + !! `getKeys()' or addEdges(). + subroutine gmshModelMeshGetAllEdges(edgeTags, edgeTags_n, edgeNodes, edgeNodes_n, ierr) bind(C, name="gmshModelMeshGetAllEdges") + use, intrinsic :: iso_c_binding + type(c_ptr), intent(out) :: edgeTags + integer(c_size_t) :: edgeTags_n + type(c_ptr), intent(out) :: edgeNodes + integer(c_size_t) :: edgeNodes_n + integer(c_int) :: ierr + end subroutine gmshModelMeshGetAllEdges + + !> Get the global unique identifiers `faceTags' and the nodes `faceNodes' of + !! the faces of type `faceType' in the mesh. Mesh faces are created e.g. by + !! `createFaces()', `getKeys()' or addFaces(). + subroutine gmshModelMeshGetAllFaces(faceType, faceTags, faceTags_n, faceNodes, faceNodes_n, ierr) bind(C, name="gmshModelMeshGetAllFaces") + use, intrinsic :: iso_c_binding + integer(c_int), value :: faceType + type(c_ptr), intent(out) :: faceTags + integer(c_size_t) :: faceTags_n + type(c_ptr), intent(out) :: faceNodes + integer(c_size_t) :: faceNodes_n + integer(c_int) :: ierr + end subroutine gmshModelMeshGetAllFaces + + !> Add mesh edges defined by their global unique identifiers `edgeTags' and + !! their nodes `edgeNodes'. + subroutine gmshModelMeshAddEdges(edgeTags, edgeTags_n, edgeNodes, edgeNodes_n, ierr) bind(C, name="gmshModelMeshAddEdges") + use, intrinsic :: iso_c_binding + integer(c_size_t) :: edgeTags(*) + integer(c_size_t), value :: edgeTags_n + integer(c_size_t) :: edgeNodes(*) + integer(c_size_t), value :: edgeNodes_n + integer(c_int) :: ierr + end subroutine gmshModelMeshAddEdges + + !> Add mesh faces of type `faceType' defined by their global unique + !! identifiers `faceTags' and their nodes `faceNodes'. + subroutine gmshModelMeshAddFaces(faceType, faceTags, faceTags_n, faceNodes, faceNodes_n, ierr) bind(C, name="gmshModelMeshAddFaces") + use, intrinsic :: iso_c_binding + integer(c_int), value :: faceType + integer(c_size_t) :: faceTags(*) + integer(c_size_t), value :: faceTags_n + integer(c_size_t) :: faceNodes(*) + integer(c_size_t), value :: faceNodes_n + integer(c_int) :: ierr + end subroutine gmshModelMeshAddFaces + + !> Generate the pair of keys for the elements of type `elementType' in the + !! entity of tag `tag', for the `functionSpaceType' function space. Each pair + !! (`typeKey', `entityKey') uniquely identifies a basis function in the + !! function space. If `returnCoord' is set, the `coord' vector contains the x, + !! y, z coordinates locating basis functions for sorting purposes. Warning: + !! this is an experimental feature and will probably change in a future + !! release. + subroutine gmshModelMeshGetKeys(elementType, functionSpaceType, typeKeys, typeKeys_n, entityKeys, entityKeys_n, coord, coord_n, tag, returnCoord, ierr) bind(C, name="gmshModelMeshGetKeys") + use, intrinsic :: iso_c_binding + integer(c_int), value :: elementType + character(len=1, kind=c_char) :: functionSpaceType(*) + type(c_ptr), intent(out) :: typeKeys + integer(c_size_t) :: typeKeys_n + type(c_ptr), intent(out) :: entityKeys + integer(c_size_t) :: entityKeys_n + type(c_ptr), intent(out) :: coord + integer(c_size_t) :: coord_n + integer(c_int), value :: tag + integer(c_int), value :: returnCoord + integer(c_int) :: ierr + end subroutine gmshModelMeshGetKeys + + !> Get the pair of keys for a single element `elementTag'. + subroutine gmshModelMeshGetKeysForElement(elementTag, functionSpaceType, typeKeys, typeKeys_n, entityKeys, entityKeys_n, coord, coord_n, returnCoord, ierr) bind(C, name="gmshModelMeshGetKeysForElement") + use, intrinsic :: iso_c_binding + integer(c_size_t), value :: elementTag + character(len=1, kind=c_char) :: functionSpaceType(*) + type(c_ptr), intent(out) :: typeKeys + integer(c_size_t) :: typeKeys_n + type(c_ptr), intent(out) :: entityKeys + integer(c_size_t) :: entityKeys_n + type(c_ptr), intent(out) :: coord + integer(c_size_t) :: coord_n + integer(c_int), value :: returnCoord + integer(c_int) :: ierr + end subroutine gmshModelMeshGetKeysForElement + + !> Get the number of keys by elements of type `elementType' for function space + !! named `functionSpaceType'. + function gmshModelMeshGetNumberOfKeys(elementType, functionSpaceType, ierr) bind(C, name="gmshModelMeshGetNumberOfKeys") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelMeshGetNumberOfKeys + integer(c_int), value :: elementType + character(len=1, kind=c_char) :: functionSpaceType(*) + integer(c_int) :: ierr + end function gmshModelMeshGetNumberOfKeys + + !> Get information about the pair of `keys'. `infoKeys' returns information + !! about the functions associated with the pairs (`typeKeys', `entityKey'). + !! `infoKeys[0].first' describes the type of function (0 for vertex function, + !! 1 for edge function, 2 for face function and 3 for bubble function). + !! `infoKeys[0].second' gives the order of the function associated with the + !! key. Warning: this is an experimental feature and will probably change in a + !! future release. + subroutine gmshModelMeshGetKeysInformation(typeKeys, typeKeys_n, entityKeys, entityKeys_n, elementType, functionSpaceType, infoKeys, infoKeys_n, ierr) bind(C, name="gmshModelMeshGetKeysInformation") + use, intrinsic :: iso_c_binding + integer(c_int) :: typeKeys(*) + integer(c_size_t), value :: typeKeys_n + integer(c_size_t) :: entityKeys(*) + integer(c_size_t), value :: entityKeys_n + integer(c_int), value :: elementType + character(len=1, kind=c_char) :: functionSpaceType(*) + type(c_ptr), intent(out) :: infoKeys + integer(c_size_t) :: infoKeys_n + integer(c_int) :: ierr + end subroutine gmshModelMeshGetKeysInformation + + !> Get the barycenters of all elements of type `elementType' classified on the + !! entity of tag `tag'. If `primary' is set, only the primary nodes of the + !! elements are taken into account for the barycenter calculation. If `fast' + !! is set, the function returns the sum of the primary node coordinates + !! (without normalizing by the number of nodes). If `tag' < 0, get the + !! barycenters for all entities. If `numTasks' > 1, only compute and return + !! the part of the data indexed by `task'. + subroutine gmshModelMeshGetBarycenters(elementType, tag, fast, primary, barycenters, barycenters_n, task, numTasks, ierr) bind(C, name="gmshModelMeshGetBarycenters") + use, intrinsic :: iso_c_binding + integer(c_int), value :: elementType + integer(c_int), value :: tag + integer(c_int), value :: fast + integer(c_int), value :: primary + type(c_ptr), intent(out) :: barycenters + integer(c_size_t) :: barycenters_n + integer(c_size_t), value :: task + integer(c_size_t), value :: numTasks + integer(c_int) :: ierr + end subroutine gmshModelMeshGetBarycenters + + !> Preallocate data before calling `getBarycenters' with `numTasks' > 1. For C + !! and C++ only. + subroutine gmshModelMeshPreallocateBarycenters(elementType, barycenters, barycenters_n, tag, ierr) bind(C, name="gmshModelMeshPreallocateBarycenters") + use, intrinsic :: iso_c_binding + integer(c_int), value :: elementType + type(c_ptr), intent(out) :: barycenters + integer(c_size_t) :: barycenters_n + integer(c_int), value :: tag + integer(c_int) :: ierr + end subroutine gmshModelMeshPreallocateBarycenters + + !> Get the nodes on the edges of all elements of type `elementType' classified + !! on the entity of tag `tag'. `nodeTags' contains the node tags of the edges + !! for all the elements: [e1a1n1, e1a1n2, e1a2n1, ...]. Data is returned by + !! element, with elements in the same order as in `getElements' and + !! `getElementsByType'. If `primary' is set, only the primary (begin/end) + !! nodes of the edges are returned. If `tag' < 0, get the edge nodes for all + !! entities. If `numTasks' > 1, only compute and return the part of the data + !! indexed by `task'. + subroutine gmshModelMeshGetElementEdgeNodes(elementType, nodeTags, nodeTags_n, tag, primary, task, numTasks, ierr) bind(C, name="gmshModelMeshGetElementEdgeNodes") + use, intrinsic :: iso_c_binding + integer(c_int), value :: elementType + type(c_ptr), intent(out) :: nodeTags + integer(c_size_t) :: nodeTags_n + integer(c_int), value :: tag + integer(c_int), value :: primary + integer(c_size_t), value :: task + integer(c_size_t), value :: numTasks + integer(c_int) :: ierr + end subroutine gmshModelMeshGetElementEdgeNodes + + !> Get the nodes on the faces of type `faceType' (3 for triangular faces, 4 + !! for quadrangular faces) of all elements of type `elementType' classified on + !! the entity of tag `tag'. `nodeTags' contains the node tags of the faces for + !! all elements: [e1f1n1, ..., e1f1nFaceType, e1f2n1, ...]. Data is returned + !! by element, with elements in the same order as in `getElements' and + !! `getElementsByType'. If `primary' is set, only the primary (corner) nodes + !! of the faces are returned. If `tag' < 0, get the face nodes for all + !! entities. If `numTasks' > 1, only compute and return the part of the data + !! indexed by `task'. + subroutine gmshModelMeshGetElementFaceNodes(elementType, faceType, nodeTags, nodeTags_n, tag, primary, task, numTasks, ierr) bind(C, name="gmshModelMeshGetElementFaceNodes") + use, intrinsic :: iso_c_binding + integer(c_int), value :: elementType + integer(c_int), value :: faceType + type(c_ptr), intent(out) :: nodeTags + integer(c_size_t) :: nodeTags_n + integer(c_int), value :: tag + integer(c_int), value :: primary + integer(c_size_t), value :: task + integer(c_size_t), value :: numTasks + integer(c_int) :: ierr + end subroutine gmshModelMeshGetElementFaceNodes + + !> Get the ghost elements `elementTags' and their associated `partitions' + !! stored in the ghost entity of dimension `dim' and tag `tag'. + subroutine gmshModelMeshGetGhostElements(dim, tag, elementTags, elementTags_n, partitions, partitions_n, ierr) bind(C, name="gmshModelMeshGetGhostElements") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + type(c_ptr), intent(out) :: elementTags + integer(c_size_t) :: elementTags_n + type(c_ptr), intent(out) :: partitions + integer(c_size_t) :: partitions_n + integer(c_int) :: ierr + end subroutine gmshModelMeshGetGhostElements + + !> Set a mesh size constraint on the model entities `dimTags'. Currently only + !! entities of dimension 0 (points) are handled. + subroutine gmshModelMeshSetSize(dimTags, dimTags_n, size, ierr) bind(C, name="gmshModelMeshSetSize") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: size + integer(c_int) :: ierr + end subroutine gmshModelMeshSetSize + + !> Get the mesh size constraints (if any) associated with the model entities + !! `dimTags'. A zero entry in the output `sizes' vector indicates that no size + !! constraint is specified on the corresponding entity. + subroutine gmshModelMeshGetSizes(dimTags, dimTags_n, sizes, sizes_n, ierr) bind(C, name="gmshModelMeshGetSizes") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + type(c_ptr), intent(out) :: sizes + integer(c_size_t) :: sizes_n + integer(c_int) :: ierr + end subroutine gmshModelMeshGetSizes + + !> Set mesh size constraints at the given parametric points `parametricCoord' + !! on the model entity of dimension `dim' and tag `tag'. Currently only + !! entities of dimension 1 (lines) are handled. + subroutine gmshModelMeshSetSizeAtParametricPoints(dim, tag, parametricCoord, parametricCoord_n, sizes, sizes_n, ierr) bind(C, name="gmshModelMeshSetSizeAtParametricPoints") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + real(c_double) :: parametricCoord(*) + integer(c_size_t), value :: parametricCoord_n + real(c_double) :: sizes(*) + integer(c_size_t), value :: sizes_n + integer(c_int) :: ierr + end subroutine gmshModelMeshSetSizeAtParametricPoints + + !> Set a mesh size callback for the current model. The callback function + !! should take six arguments as input (`dim', `tag', `x', `y', `z' and `lc'). + !! The first two integer arguments correspond to the dimension `dim' and tag + !! `tag' of the entity being meshed. The next four double precision arguments + !! correspond to the coordinates `x', `y' and `z' around which to prescribe + !! the mesh size and to the mesh size `lc' that would be prescribed if the + !! callback had not been called. The callback function should return a double + !! precision number specifying the desired mesh size; returning `lc' is + !! equivalent to a no-op. + subroutine gmshModelMeshSetSizeCallback(callback, ierr) bind(C, name="gmshModelMeshSetSizeCallback") + use, intrinsic :: iso_c_binding + type(c_funptr) :: callback ! TODO: Needs implementation + integer(c_int) :: ierr + end subroutine gmshModelMeshSetSizeCallback + + !> Remove the mesh size callback from the current model. + subroutine gmshModelMeshRemoveSizeCallback(ierr) bind(C, name="gmshModelMeshRemoveSizeCallback") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshModelMeshRemoveSizeCallback + + !> Set a transfinite meshing constraint on the curve `tag', with `numNodes' + !! nodes distributed according to `meshType' and `coef'. Currently supported + !! types are "Progression" (geometrical progression with power `coef'), "Bump" + !! (refinement toward both extremities of the curve) and "Beta" (beta law). + subroutine gmshModelMeshSetTransfiniteCurve(tag, numNodes, meshType, coef, ierr) bind(C, name="gmshModelMeshSetTransfiniteCurve") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + integer(c_int), value :: numNodes + character(len=1, kind=c_char) :: meshType(*) + real(c_double), value :: coef + integer(c_int) :: ierr + end subroutine gmshModelMeshSetTransfiniteCurve + + !> Set a transfinite meshing constraint on the surface `tag'. `arrangement' + !! describes the arrangement of the triangles when the surface is not flagged + !! as recombined: currently supported values are "Left", "Right", + !! "AlternateLeft" and "AlternateRight". `cornerTags' can be used to specify + !! the (3 or 4) corners of the transfinite interpolation explicitly; + !! specifying the corners explicitly is mandatory if the surface has more that + !! 3 or 4 points on its boundary. + subroutine gmshModelMeshSetTransfiniteSurface(tag, arrangement, cornerTags, cornerTags_n, ierr) bind(C, name="gmshModelMeshSetTransfiniteSurface") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + character(len=1, kind=c_char) :: arrangement(*) + integer(c_int) :: cornerTags(*) + integer(c_size_t), value :: cornerTags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshSetTransfiniteSurface + + !> Set a transfinite meshing constraint on the surface `tag'. `cornerTags' can + !! be used to specify the (6 or 8) corners of the transfinite interpolation + !! explicitly. + subroutine gmshModelMeshSetTransfiniteVolume(tag, cornerTags, cornerTags_n, ierr) bind(C, name="gmshModelMeshSetTransfiniteVolume") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + integer(c_int) :: cornerTags(*) + integer(c_size_t), value :: cornerTags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshSetTransfiniteVolume + + !> Set transfinite meshing constraints on the model entities in `dimTag'. + !! Transfinite meshing constraints are added to the curves of the quadrangular + !! surfaces and to the faces of 6-sided volumes. Quadragular faces with a + !! corner angle superior to `cornerAngle' (in radians) are ignored. The number + !! of points is automatically determined from the sizing constraints. If + !! `dimTag' is empty, the constraints are applied to all entities in the + !! model. If `recombine' is true, the recombine flag is automatically set on + !! the transfinite surfaces. + subroutine gmshModelMeshSetTransfiniteAutomatic(dimTags, dimTags_n, cornerAngle, recombine, ierr) bind(C, name="gmshModelMeshSetTransfiniteAutomatic") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: cornerAngle + integer(c_int), value :: recombine + integer(c_int) :: ierr + end subroutine gmshModelMeshSetTransfiniteAutomatic + + !> Set a recombination meshing constraint on the model entity of dimension + !! `dim' and tag `tag'. Currently only entities of dimension 2 (to recombine + !! triangles into quadrangles) are supported; `angle' specifies the threshold + !! angle for the simple recombination algorithm.. + subroutine gmshModelMeshSetRecombine(dim, tag, angle, ierr) bind(C, name="gmshModelMeshSetRecombine") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + real(c_double), value :: angle + integer(c_int) :: ierr + end subroutine gmshModelMeshSetRecombine + + !> Set a smoothing meshing constraint on the model entity of dimension `dim' + !! and tag `tag'. `val' iterations of a Laplace smoother are applied. + subroutine gmshModelMeshSetSmoothing(dim, tag, val, ierr) bind(C, name="gmshModelMeshSetSmoothing") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int), value :: val + integer(c_int) :: ierr + end subroutine gmshModelMeshSetSmoothing + + !> Set a reverse meshing constraint on the model entity of dimension `dim' and + !! tag `tag'. If `val' is true, the mesh orientation will be reversed with + !! respect to the natural mesh orientation (i.e. the orientation consistent + !! with the orientation of the geometry). If `val' is false, the mesh is left + !! as-is. + subroutine gmshModelMeshSetReverse(dim, tag, val, ierr) bind(C, name="gmshModelMeshSetReverse") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int), value :: val + integer(c_int) :: ierr + end subroutine gmshModelMeshSetReverse + + !> Set the meshing algorithm on the model entity of dimension `dim' and tag + !! `tag'. Currently only supported for `dim' == 2. + subroutine gmshModelMeshSetAlgorithm(dim, tag, val, ierr) bind(C, name="gmshModelMeshSetAlgorithm") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int), value :: val + integer(c_int) :: ierr + end subroutine gmshModelMeshSetAlgorithm + + !> Force the mesh size to be extended from the boundary, or not, for the model + !! entity of dimension `dim' and tag `tag'. Currently only supported for `dim' + !! == 2. + subroutine gmshModelMeshSetSizeFromBoundary(dim, tag, val, ierr) bind(C, name="gmshModelMeshSetSizeFromBoundary") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int), value :: val + integer(c_int) :: ierr + end subroutine gmshModelMeshSetSizeFromBoundary + + !> Set a compound meshing constraint on the model entities of dimension `dim' + !! and tags `tags'. During meshing, compound entities are treated as a single + !! discrete entity, which is automatically reparametrized. + subroutine gmshModelMeshSetCompound(dim, tags, tags_n, ierr) bind(C, name="gmshModelMeshSetCompound") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int) :: tags(*) + integer(c_size_t), value :: tags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshSetCompound + + !> Set meshing constraints on the bounding surfaces of the volume of tag `tag' + !! so that all surfaces are oriented with outward pointing normals; and if a + !! mesh already exists, reorient it. Currently only available with the + !! OpenCASCADE kernel, as it relies on the STL triangulation. + subroutine gmshModelMeshSetOutwardOrientation(tag, ierr) bind(C, name="gmshModelMeshSetOutwardOrientation") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + integer(c_int) :: ierr + end subroutine gmshModelMeshSetOutwardOrientation + + !> Remove all meshing constraints from the model entities `dimTags'. If + !! `dimTags' is empty, remove all constraings. + subroutine gmshModelMeshRemoveConstraints(dimTags, dimTags_n, ierr) bind(C, name="gmshModelMeshRemoveConstraints") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshRemoveConstraints + + !> Embed the model entities of dimension `dim' and tags `tags' in the + !! (`inDim', `inTag') model entity. The dimension `dim' can 0, 1 or 2 and must + !! be strictly smaller than `inDim', which must be either 2 or 3. The embedded + !! entities should not intersect each other or be part of the boundary of the + !! entity `inTag', whose mesh will conform to the mesh of the embedded + !! entities. With the OpenCASCADE kernel, if the `fragment' operation is + !! applied to entities of different dimensions, the lower dimensional entities + !! will be automatically embedded in the higher dimensional entities if they + !! are not on their boundary. + subroutine gmshModelMeshEmbed(dim, tags, tags_n, inDim, inTag, ierr) bind(C, name="gmshModelMeshEmbed") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int) :: tags(*) + integer(c_size_t), value :: tags_n + integer(c_int), value :: inDim + integer(c_int), value :: inTag + integer(c_int) :: ierr + end subroutine gmshModelMeshEmbed + + !> Remove embedded entities from the model entities `dimTags'. if `dim' is >= + !! 0, only remove embedded entities of the given dimension (e.g. embedded + !! points if `dim' == 0). + subroutine gmshModelMeshRemoveEmbedded(dimTags, dimTags_n, dim, ierr) bind(C, name="gmshModelMeshRemoveEmbedded") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int), value :: dim + integer(c_int) :: ierr + end subroutine gmshModelMeshRemoveEmbedded + + !> Get the entities (if any) embedded in the model entity of dimension `dim' + !! and tag `tag'. + subroutine gmshModelMeshGetEmbedded(dim, tag, dimTags, dimTags_n, ierr) bind(C, name="gmshModelMeshGetEmbedded") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + type(c_ptr), intent(out) :: dimTags + integer(c_size_t) :: dimTags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshGetEmbedded + + !> Reorder the elements of type `elementType' classified on the entity of tag + !! `tag' according to `ordering'. + subroutine gmshModelMeshReorderElements(elementType, tag, ordering, ordering_n, ierr) bind(C, name="gmshModelMeshReorderElements") + use, intrinsic :: iso_c_binding + integer(c_int), value :: elementType + integer(c_int), value :: tag + integer(c_size_t) :: ordering(*) + integer(c_size_t), value :: ordering_n + integer(c_int) :: ierr + end subroutine gmshModelMeshReorderElements + + !> Renumber the node tags in a continuous sequence. + subroutine gmshModelMeshRenumberNodes(ierr) bind(C, name="gmshModelMeshRenumberNodes") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshModelMeshRenumberNodes + + !> Renumber the element tags in a continuous sequence. + subroutine gmshModelMeshRenumberElements(ierr) bind(C, name="gmshModelMeshRenumberElements") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshModelMeshRenumberElements + + !> Set the meshes of the entities of dimension `dim' and tag `tags' as + !! periodic copies of the meshes of entities `tagsMaster', using the affine + !! transformation specified in `affineTransformation' (16 entries of a 4x4 + !! matrix, by row). If used after meshing, generate the periodic node + !! correspondence information assuming the meshes of entities `tags' + !! effectively match the meshes of entities `tagsMaster' (useful for + !! structured and extruded meshes). Currently only available for @code{dim} == + !! 1 and @code{dim} == 2. + subroutine gmshModelMeshSetPeriodic(dim, tags, tags_n, tagsMaster, tagsMaster_n, affineTransform, affineTransform_n, ierr) bind(C, name="gmshModelMeshSetPeriodic") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int) :: tags(*) + integer(c_size_t), value :: tags_n + integer(c_int) :: tagsMaster(*) + integer(c_size_t), value :: tagsMaster_n + real(c_double) :: affineTransform(*) + integer(c_size_t), value :: affineTransform_n + integer(c_int) :: ierr + end subroutine gmshModelMeshSetPeriodic + + !> Get master entities `tagsMaster' for the entities of dimension `dim' and + !! tags `tags'. + subroutine gmshModelMeshGetPeriodic(dim, tags, tags_n, tagMaster, tagMaster_n, ierr) bind(C, name="gmshModelMeshGetPeriodic") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int) :: tags(*) + integer(c_size_t), value :: tags_n + type(c_ptr), intent(out) :: tagMaster + integer(c_size_t) :: tagMaster_n + integer(c_int) :: ierr + end subroutine gmshModelMeshGetPeriodic + + !> Get the master entity `tagMaster', the node tags `nodeTags' and their + !! corresponding master node tags `nodeTagsMaster', and the affine transform + !! `affineTransform' for the entity of dimension `dim' and tag `tag'. If + !! `includeHighOrderNodes' is set, include high-order nodes in the returned + !! data. + subroutine gmshModelMeshGetPeriodicNodes(dim, tag, tagMaster, nodeTags, nodeTags_n, nodeTagsMaster, nodeTagsMaster_n, affineTransform, affineTransform_n, includeHighOrderNodes, ierr) bind(C, name="gmshModelMeshGetPeriodicNodes") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int) :: tagMaster + type(c_ptr), intent(out) :: nodeTags + integer(c_size_t) :: nodeTags_n + type(c_ptr), intent(out) :: nodeTagsMaster + integer(c_size_t) :: nodeTagsMaster_n + type(c_ptr), intent(out) :: affineTransform + integer(c_size_t) :: affineTransform_n + integer(c_int), value :: includeHighOrderNodes + integer(c_int) :: ierr + end subroutine gmshModelMeshGetPeriodicNodes + + !> Get the master entity `tagMaster' and the key pairs (`typeKeyMaster', + !! `entityKeyMaster') corresponding to the entity `tag' and the key pairs + !! (`typeKey', `entityKey') for the elements of type `elementType' and + !! function space type `functionSpaceType'. If `returnCoord' is set, the + !! `coord' and `coordMaster' vectors contain the x, y, z coordinates locating + !! basis functions for sorting purposes. + subroutine gmshModelMeshGetPeriodicKeys(elementType, functionSpaceType, tag, tagMaster, typeKeys, typeKeys_n, typeKeysMaster, typeKeysMaster_n, entityKeys, entityKeys_n, entityKeysMaster, entityKeysMaster_n, coord, coord_n, coordMaster, coordMaster_n, returnCoord, ierr) bind(C, name="gmshModelMeshGetPeriodicKeys") + use, intrinsic :: iso_c_binding + integer(c_int), value :: elementType + character(len=1, kind=c_char) :: functionSpaceType(*) + integer(c_int), value :: tag + integer(c_int) :: tagMaster + type(c_ptr), intent(out) :: typeKeys + integer(c_size_t) :: typeKeys_n + type(c_ptr), intent(out) :: typeKeysMaster + integer(c_size_t) :: typeKeysMaster_n + type(c_ptr), intent(out) :: entityKeys + integer(c_size_t) :: entityKeys_n + type(c_ptr), intent(out) :: entityKeysMaster + integer(c_size_t) :: entityKeysMaster_n + type(c_ptr), intent(out) :: coord + integer(c_size_t) :: coord_n + type(c_ptr), intent(out) :: coordMaster + integer(c_size_t) :: coordMaster_n + integer(c_int), value :: returnCoord + integer(c_int) :: ierr + end subroutine gmshModelMeshGetPeriodicKeys + + !> Import the model STL representation (if available) as the current mesh. + subroutine gmshModelMeshImportStl(ierr) bind(C, name="gmshModelMeshImportStl") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshModelMeshImportStl + + !> Get the `tags' of any duplicate nodes in the mesh of the entities + !! `dimTags'. If `dimTags' is empty, consider the whole mesh. + subroutine gmshModelMeshGetDuplicateNodes(tags, tags_n, dimTags, dimTags_n, ierr) bind(C, name="gmshModelMeshGetDuplicateNodes") + use, intrinsic :: iso_c_binding + type(c_ptr), intent(out) :: tags + integer(c_size_t) :: tags_n + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshGetDuplicateNodes + + !> Remove duplicate nodes in the mesh of the entities `dimTags'. If `dimTags' + !! is empty, consider the whole mesh. + subroutine gmshModelMeshRemoveDuplicateNodes(dimTags, dimTags_n, ierr) bind(C, name="gmshModelMeshRemoveDuplicateNodes") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshRemoveDuplicateNodes + + !> Remove duplicate elements (defined by the same nodes, in the same entity) + !! in the mesh of the entities `dimTags'. If `dimTags' is empty, consider the + !! whole mesh. + subroutine gmshModelMeshRemoveDuplicateElements(dimTags, dimTags_n, ierr) bind(C, name="gmshModelMeshRemoveDuplicateElements") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshRemoveDuplicateElements + + !> Split (into two triangles) all quadrangles in surface `tag' whose quality + !! is lower than `quality'. If `tag' < 0, split quadrangles in all surfaces. + subroutine gmshModelMeshSplitQuadrangles(quality, tag, ierr) bind(C, name="gmshModelMeshSplitQuadrangles") + use, intrinsic :: iso_c_binding + real(c_double), value :: quality + integer(c_int), value :: tag + integer(c_int) :: ierr + end subroutine gmshModelMeshSplitQuadrangles + + !> Set the visibility of the elements of tags `elementTags' to `value'. + subroutine gmshModelMeshSetVisibility(elementTags, elementTags_n, value, ierr) bind(C, name="gmshModelMeshSetVisibility") + use, intrinsic :: iso_c_binding + integer(c_size_t) :: elementTags(*) + integer(c_size_t), value :: elementTags_n + integer(c_int), value :: value + integer(c_int) :: ierr + end subroutine gmshModelMeshSetVisibility + + !> Classify ("color") the surface mesh based on the angle threshold `angle' + !! (in radians), and create new discrete surfaces, curves and points + !! accordingly. If `boundary' is set, also create discrete curves on the + !! boundary if the surface is open. If `forReparametrization' is set, create + !! curves and surfaces that can be reparametrized using a single map. If + !! `curveAngle' is less than Pi, also force curves to be split according to + !! `curveAngle'. If `exportDiscrete' is set, clear any built-in CAD kernel + !! entities and export the discrete entities in the built-in CAD kernel. + subroutine gmshModelMeshClassifySurfaces(angle, boundary, forReparametrization, curveAngle, exportDiscrete, ierr) bind(C, name="gmshModelMeshClassifySurfaces") + use, intrinsic :: iso_c_binding + real(c_double), value :: angle + integer(c_int), value :: boundary + integer(c_int), value :: forReparametrization + real(c_double), value :: curveAngle + integer(c_int), value :: exportDiscrete + integer(c_int) :: ierr + end subroutine gmshModelMeshClassifySurfaces + + !> Create a geometry for the discrete entities `dimTags' (represented solely + !! by a mesh, without an underlying CAD description), i.e. create a + !! parametrization for discrete curves and surfaces, assuming that each can be + !! parametrized with a single map. If `dimTags' is empty, create a geometry + !! for all the discrete entities. + subroutine gmshModelMeshCreateGeometry(dimTags, dimTags_n, ierr) bind(C, name="gmshModelMeshCreateGeometry") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshCreateGeometry + + !> Create a boundary representation from the mesh if the model does not have + !! one (e.g. when imported from mesh file formats with no BRep representation + !! of the underlying model). If `makeSimplyConnected' is set, enforce simply + !! connected discrete surfaces and volumes. If `exportDiscrete' is set, clear + !! any built-in CAD kernel entities and export the discrete entities in the + !! built-in CAD kernel. + subroutine gmshModelMeshCreateTopology(makeSimplyConnected, exportDiscrete, ierr) bind(C, name="gmshModelMeshCreateTopology") + use, intrinsic :: iso_c_binding + integer(c_int), value :: makeSimplyConnected + integer(c_int), value :: exportDiscrete + integer(c_int) :: ierr + end subroutine gmshModelMeshCreateTopology + + !> Add a request to compute a basis representation for homology spaces (if + !! `type' == "Homology") or cohomology spaces (if `type' == "Cohomology"). The + !! computation domain is given in a list of physical group tags `domainTags'; + !! if empty, the whole mesh is the domain. The computation subdomain for + !! relative (co)homology computation is given in a list of physical group tags + !! `subdomainTags'; if empty, absolute (co)homology is computed. The + !! dimensions of the (co)homology bases to be computed are given in the list + !! `dim'; if empty, all bases are computed. Resulting basis representation + !! (co)chains are stored as physical groups in the mesh. If the request is + !! added before mesh generation, the computation will be performed at the end + !! of the meshing pipeline. + subroutine gmshModelMeshAddHomologyRequest(type, domainTags, domainTags_n, subdomainTags, subdomainTags_n, dims, dims_n, ierr) bind(C, name="gmshModelMeshAddHomologyRequest") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: type(*) + integer(c_int) :: domainTags(*) + integer(c_size_t), value :: domainTags_n + integer(c_int) :: subdomainTags(*) + integer(c_size_t), value :: subdomainTags_n + integer(c_int) :: dims(*) + integer(c_size_t), value :: dims_n + integer(c_int) :: ierr + end subroutine gmshModelMeshAddHomologyRequest + + !> Clear all (co)homology computation requests. + subroutine gmshModelMeshClearHomologyRequests(ierr) bind(C, name="gmshModelMeshClearHomologyRequests") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshModelMeshClearHomologyRequests + + !> Perform the (co)homology computations requested by addHomologyRequest(). + subroutine gmshModelMeshComputeHomology(ierr) bind(C, name="gmshModelMeshComputeHomology") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshModelMeshComputeHomology + + !> Compute a cross field for the current mesh. The function creates 3 views: + !! the H function, the Theta function and cross directions. Return the tags of + !! the views. + subroutine gmshModelMeshComputeCrossField(viewTags, viewTags_n, ierr) bind(C, name="gmshModelMeshComputeCrossField") + use, intrinsic :: iso_c_binding + type(c_ptr), intent(out) :: viewTags + integer(c_size_t) :: viewTags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshComputeCrossField + + !> Triangulate the points given in the `coord' vector as pairs of u, v + !! coordinates, and return the node tags (with numbering starting at 1) of the + !! resulting triangles in `tri'. + subroutine gmshModelMeshTriangulate(coord, coord_n, tri, tri_n, ierr) bind(C, name="gmshModelMeshTriangulate") + use, intrinsic :: iso_c_binding + real(c_double) :: coord(*) + integer(c_size_t), value :: coord_n + type(c_ptr), intent(out) :: tri + integer(c_size_t) :: tri_n + integer(c_int) :: ierr + end subroutine gmshModelMeshTriangulate + + !> Tetrahedralize the points given in the `coord' vector as triplets of x, y, + !! z coordinates, and return the node tags (with numbering starting at 1) of + !! the resulting tetrahedra in `tetra'. + subroutine gmshModelMeshTetrahedralize(coord, coord_n, tetra, tetra_n, ierr) bind(C, name="gmshModelMeshTetrahedralize") + use, intrinsic :: iso_c_binding + real(c_double) :: coord(*) + integer(c_size_t), value :: coord_n + type(c_ptr), intent(out) :: tetra + integer(c_size_t) :: tetra_n + integer(c_int) :: ierr + end subroutine gmshModelMeshTetrahedralize + + !> Add a new mesh size field of type `fieldType'. If `tag' is positive, assign + !! the tag explicitly; otherwise a new tag is assigned automatically. Return + !! the field tag. + function gmshModelMeshFieldAdd(fieldType, tag, ierr) bind(C, name="gmshModelMeshFieldAdd") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelMeshFieldAdd + character(len=1, kind=c_char) :: fieldType(*) + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelMeshFieldAdd + + !> Remove the field with tag `tag'. + subroutine gmshModelMeshFieldRemove(tag, ierr) bind(C, name="gmshModelMeshFieldRemove") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + integer(c_int) :: ierr + end subroutine gmshModelMeshFieldRemove + + !> Get the list of all fields. + subroutine gmshModelMeshFieldList(tags, tags_n, ierr) bind(C, name="gmshModelMeshFieldList") + use, intrinsic :: iso_c_binding + type(c_ptr), intent(out) :: tags + integer(c_size_t) :: tags_n + integer(c_int) :: ierr + end subroutine gmshModelMeshFieldList + + !> Get the type `fieldType' of the field with tag `tag'. + subroutine gmshModelMeshFieldGetType(tag, fileType, ierr) bind(C, name="gmshModelMeshFieldGetType") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + type(c_ptr) :: fileType(*) + integer(c_int) :: ierr + end subroutine gmshModelMeshFieldGetType + + !> Set the numerical option `option' to value `value' for field `tag'. + subroutine gmshModelMeshFieldSetNumber(tag, option, value, ierr) bind(C, name="gmshModelMeshFieldSetNumber") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + character(len=1, kind=c_char) :: option(*) + real(c_double), value :: value + integer(c_int) :: ierr + end subroutine gmshModelMeshFieldSetNumber + + !> Get the value of the numerical option `option' for field `tag'. + subroutine gmshModelMeshFieldGetNumber(tag, option, value, ierr) bind(C, name="gmshModelMeshFieldGetNumber") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + character(len=1, kind=c_char) :: option(*) + real(c_double) :: value + integer(c_int) :: ierr + end subroutine gmshModelMeshFieldGetNumber + + !> Set the string option `option' to value `value' for field `tag'. + subroutine gmshModelMeshFieldSetString(tag, option, value, ierr) bind(C, name="gmshModelMeshFieldSetString") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + character(len=1, kind=c_char) :: option(*) + character(len=1, kind=c_char) :: value(*) + integer(c_int) :: ierr + end subroutine gmshModelMeshFieldSetString + + !> Get the value of the string option `option' for field `tag'. + subroutine gmshModelMeshFieldGetString(tag, option, value, ierr) bind(C, name="gmshModelMeshFieldGetString") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + character(len=1, kind=c_char) :: option(*) + type(c_ptr) :: value(*) + integer(c_int) :: ierr + end subroutine gmshModelMeshFieldGetString + + !> Set the numerical list option `option' to value `value' for field `tag'. + subroutine gmshModelMeshFieldSetNumbers(tag, option, value, value_n, ierr) bind(C, name="gmshModelMeshFieldSetNumbers") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + character(len=1, kind=c_char) :: option(*) + real(c_double) :: value(*) + integer(c_size_t), value :: value_n + integer(c_int) :: ierr + end subroutine gmshModelMeshFieldSetNumbers + + !> Get the value of the numerical list option `option' for field `tag'. + subroutine gmshModelMeshFieldGetNumbers(tag, option, value, value_n, ierr) bind(C, name="gmshModelMeshFieldGetNumbers") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + character(len=1, kind=c_char) :: option(*) + type(c_ptr), intent(out) :: value + integer(c_size_t) :: value_n + integer(c_int) :: ierr + end subroutine gmshModelMeshFieldGetNumbers + + !> Set the field `tag' as the background mesh size field. + subroutine gmshModelMeshFieldSetAsBackgroundMesh(tag, ierr) bind(C, name="gmshModelMeshFieldSetAsBackgroundMesh") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + integer(c_int) :: ierr + end subroutine gmshModelMeshFieldSetAsBackgroundMesh + + !> Set the field `tag' as a boundary layer size field. + subroutine gmshModelMeshFieldSetAsBoundaryLayer(tag, ierr) bind(C, name="gmshModelMeshFieldSetAsBoundaryLayer") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + integer(c_int) :: ierr + end subroutine gmshModelMeshFieldSetAsBoundaryLayer + + !> Add a geometrical point in the built-in CAD representation, at coordinates + !! (`x', `y', `z'). If `meshSize' is > 0, add a meshing constraint at that + !! point. If `tag' is positive, set the tag explicitly; otherwise a new tag is + !! selected automatically. Return the tag of the point. (Note that the point + !! will be added in the current model only after `synchronize' is called. This + !! behavior holds for all the entities added in the geo module.) + function gmshModelGeoAddPoint(x, y, z, meshSize, tag, ierr) bind(C, name="gmshModelGeoAddPoint") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGeoAddPoint + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + real(c_double), value :: meshSize + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelGeoAddPoint + + !> Add a straight line segment in the built-in CAD representation, between the + !! two points with tags `startTag' and `endTag'. If `tag' is positive, set the + !! tag explicitly; otherwise a new tag is selected automatically. Return the + !! tag of the line. + function gmshModelGeoAddLine(startTag, endTag, tag, ierr) bind(C, name="gmshModelGeoAddLine") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGeoAddLine + integer(c_int), value :: startTag + integer(c_int), value :: endTag + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelGeoAddLine + + !> Add a circle arc (strictly smaller than Pi) in the built-in CAD + !! representation, between the two points with tags `startTag' and `endTag', + !! and with center `centerTag'. If `tag' is positive, set the tag explicitly; + !! otherwise a new tag is selected automatically. If (`nx', `ny', `nz') != (0, + !! 0, 0), explicitly set the plane of the circle arc. Return the tag of the + !! circle arc. + function gmshModelGeoAddCircleArc(startTag, centerTag, endTag, tag, nx, ny, nz, ierr) bind(C, name="gmshModelGeoAddCircleArc") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGeoAddCircleArc + integer(c_int), value :: startTag + integer(c_int), value :: centerTag + integer(c_int), value :: endTag + integer(c_int), value :: tag + real(c_double), value :: nx + real(c_double), value :: ny + real(c_double), value :: nz + integer(c_int) :: ierr + end function gmshModelGeoAddCircleArc + + !> Add an ellipse arc (strictly smaller than Pi) in the built-in CAD + !! representation, between the two points `startTag' and `endTag', and with + !! center `centerTag' and major axis point `majorTag'. If `tag' is positive, + !! set the tag explicitly; otherwise a new tag is selected automatically. If + !! (`nx', `ny', `nz') != (0, 0, 0), explicitly set the plane of the circle + !! arc. Return the tag of the ellipse arc. + function gmshModelGeoAddEllipseArc(startTag, centerTag, majorTag, endTag, tag, nx, ny, nz, ierr) bind(C, name="gmshModelGeoAddEllipseArc") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGeoAddEllipseArc + integer(c_int), value :: startTag + integer(c_int), value :: centerTag + integer(c_int), value :: majorTag + integer(c_int), value :: endTag + integer(c_int), value :: tag + real(c_double), value :: nx + real(c_double), value :: ny + real(c_double), value :: nz + integer(c_int) :: ierr + end function gmshModelGeoAddEllipseArc + + !> Add a spline (Catmull-Rom) curve in the built-in CAD representation, going + !! through the points `pointTags'. If `tag' is positive, set the tag + !! explicitly; otherwise a new tag is selected automatically. Create a + !! periodic curve if the first and last points are the same. Return the tag of + !! the spline curve. + function gmshModelGeoAddSpline(pointTags, pointTags_n, tag, ierr) bind(C, name="gmshModelGeoAddSpline") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGeoAddSpline + integer(c_int) :: pointTags(*) + integer(c_size_t), value :: pointTags_n + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelGeoAddSpline + + !> Add a cubic b-spline curve in the built-in CAD representation, with + !! `pointTags' control points. If `tag' is positive, set the tag explicitly; + !! otherwise a new tag is selected automatically. Creates a periodic curve if + !! the first and last points are the same. Return the tag of the b-spline + !! curve. + function gmshModelGeoAddBSpline(pointTags, pointTags_n, tag, ierr) bind(C, name="gmshModelGeoAddBSpline") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGeoAddBSpline + integer(c_int) :: pointTags(*) + integer(c_size_t), value :: pointTags_n + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelGeoAddBSpline + + !> Add a Bezier curve in the built-in CAD representation, with `pointTags' + !! control points. If `tag' is positive, set the tag explicitly; otherwise a + !! new tag is selected automatically. Return the tag of the Bezier curve. + function gmshModelGeoAddBezier(pointTags, pointTags_n, tag, ierr) bind(C, name="gmshModelGeoAddBezier") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGeoAddBezier + integer(c_int) :: pointTags(*) + integer(c_size_t), value :: pointTags_n + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelGeoAddBezier + + !> Add a polyline curve in the built-in CAD representation, going through the + !! points `pointTags'. If `tag' is positive, set the tag explicitly; otherwise + !! a new tag is selected automatically. Create a periodic curve if the first + !! and last points are the same. Return the tag of the polyline curve. + function gmshModelGeoAddPolyline(pointTags, pointTags_n, tag, ierr) bind(C, name="gmshModelGeoAddPolyline") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGeoAddPolyline + integer(c_int) :: pointTags(*) + integer(c_size_t), value :: pointTags_n + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelGeoAddPolyline + + !> Add a spline (Catmull-Rom) curve in the built-in CAD representation, going + !! through points sampling the curves in `curveTags'. The density of sampling + !! points on each curve is governed by `numIntervals'. If `tag' is positive, + !! set the tag explicitly; otherwise a new tag is selected automatically. + !! Return the tag of the spline. + function gmshModelGeoAddCompoundSpline(curveTags, curveTags_n, numIntervals, tag, ierr) bind(C, name="gmshModelGeoAddCompoundSpline") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGeoAddCompoundSpline + integer(c_int) :: curveTags(*) + integer(c_size_t), value :: curveTags_n + integer(c_int), value :: numIntervals + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelGeoAddCompoundSpline + + !> Add a b-spline curve in the built-in CAD representation, with control + !! points sampling the curves in `curveTags'. The density of sampling points + !! on each curve is governed by `numIntervals'. If `tag' is positive, set the + !! tag explicitly; otherwise a new tag is selected automatically. Return the + !! tag of the b-spline. + function gmshModelGeoAddCompoundBSpline(curveTags, curveTags_n, numIntervals, tag, ierr) bind(C, name="gmshModelGeoAddCompoundBSpline") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGeoAddCompoundBSpline + integer(c_int) :: curveTags(*) + integer(c_size_t), value :: curveTags_n + integer(c_int), value :: numIntervals + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelGeoAddCompoundBSpline + + !> Add a curve loop (a closed wire) in the built-in CAD representation, formed + !! by the curves `curveTags'. `curveTags' should contain (signed) tags of + !! model entities of dimension 1 forming a closed loop: a negative tag + !! signifies that the underlying curve is considered with reversed + !! orientation. If `tag' is positive, set the tag explicitly; otherwise a new + !! tag is selected automatically. If `reorient' is set, automatically reorient + !! the curves if necessary. Return the tag of the curve loop. + function gmshModelGeoAddCurveLoop(curveTags, curveTags_n, tag, reorient, ierr) bind(C, name="gmshModelGeoAddCurveLoop") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGeoAddCurveLoop + integer(c_int) :: curveTags(*) + integer(c_size_t), value :: curveTags_n + integer(c_int), value :: tag + integer(c_int), value :: reorient + integer(c_int) :: ierr + end function gmshModelGeoAddCurveLoop + + !> Add curve loops in the built-in CAD representation based on the curves + !! `curveTags'. Return the `tags' of found curve loops, if any. + subroutine gmshModelGeoAddCurveLoops(curveTags, curveTags_n, tags, tags_n, ierr) bind(C, name="gmshModelGeoAddCurveLoops") + use, intrinsic :: iso_c_binding + integer(c_int) :: curveTags(*) + integer(c_size_t), value :: curveTags_n + type(c_ptr), intent(out) :: tags + integer(c_size_t) :: tags_n + integer(c_int) :: ierr + end subroutine gmshModelGeoAddCurveLoops + + !> Add a plane surface in the built-in CAD representation, defined by one or + !! more curve loops `wireTags'. The first curve loop defines the exterior + !! contour; additional curve loop define holes. If `tag' is positive, set the + !! tag explicitly; otherwise a new tag is selected automatically. Return the + !! tag of the surface. + function gmshModelGeoAddPlaneSurface(wireTags, wireTags_n, tag, ierr) bind(C, name="gmshModelGeoAddPlaneSurface") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGeoAddPlaneSurface + integer(c_int) :: wireTags(*) + integer(c_size_t), value :: wireTags_n + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelGeoAddPlaneSurface + + !> Add a surface in the built-in CAD representation, filling the curve loops + !! in `wireTags' using transfinite interpolation. Currently only a single + !! curve loop is supported; this curve loop should be composed by 3 or 4 + !! curves only. If `tag' is positive, set the tag explicitly; otherwise a new + !! tag is selected automatically. Return the tag of the surface. + function gmshModelGeoAddSurfaceFilling(wireTags, wireTags_n, tag, sphereCenterTag, ierr) bind(C, name="gmshModelGeoAddSurfaceFilling") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGeoAddSurfaceFilling + integer(c_int) :: wireTags(*) + integer(c_size_t), value :: wireTags_n + integer(c_int), value :: tag + integer(c_int), value :: sphereCenterTag + integer(c_int) :: ierr + end function gmshModelGeoAddSurfaceFilling + + !> Add a surface loop (a closed shell) formed by `surfaceTags' in the built-in + !! CAD representation. If `tag' is positive, set the tag explicitly; + !! otherwise a new tag is selected automatically. Return the tag of the shell. + function gmshModelGeoAddSurfaceLoop(surfaceTags, surfaceTags_n, tag, ierr) bind(C, name="gmshModelGeoAddSurfaceLoop") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGeoAddSurfaceLoop + integer(c_int) :: surfaceTags(*) + integer(c_size_t), value :: surfaceTags_n + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelGeoAddSurfaceLoop + + !> Add a volume (a region) in the built-in CAD representation, defined by one + !! or more shells `shellTags'. The first surface loop defines the exterior + !! boundary; additional surface loop define holes. If `tag' is positive, set + !! the tag explicitly; otherwise a new tag is selected automatically. Return + !! the tag of the volume. + function gmshModelGeoAddVolume(shellTags, shellTags_n, tag, ierr) bind(C, name="gmshModelGeoAddVolume") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGeoAddVolume + integer(c_int) :: shellTags(*) + integer(c_size_t), value :: shellTags_n + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelGeoAddVolume + + !> Add a `geometry' in the built-in CAD representation. `geometry' can + !! currently be one of "Sphere" or "PolarSphere" (where `numbers' should + !! contain the x, y, z coordinates of the center, followed by the radius), or + !! "Parametric" (where `strings' should contains three expression evaluating + !! to the x, y and z coordinates. If `tag' is positive, set the tag of the + !! geometry explicitly; otherwise a new tag is selected automatically. Return + !! the tag of the geometry. + function gmshModelGeoAddGeometry(geometry, numbers, numbers_n, strings, strings_n, tag, ierr) bind(C, name="gmshModelGeoAddGeometry") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGeoAddGeometry + character(len=1, kind=c_char) :: geometry(*) + real(c_double) :: numbers(*) + integer(c_size_t), value :: numbers_n + type(c_ptr) :: strings(*) + integer(c_size_t), value :: strings_n + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelGeoAddGeometry + + !> Add a point in the built-in CAD representation, at coordinates (`x', `y', + !! `z') on the geometry `geometryTag'. If `meshSize' is > 0, add a meshing + !! constraint at that point. If `tag' is positive, set the tag explicitly; + !! otherwise a new tag is selected automatically. Return the tag of the point. + !! For surface geometries, only the `x' and `y' coordinates are used. + function gmshModelGeoAddPointOnGeometry(geometryTag, x, y, z, meshSize, tag, ierr) bind(C, name="gmshModelGeoAddPointOnGeometry") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGeoAddPointOnGeometry + integer(c_int), value :: geometryTag + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + real(c_double), value :: meshSize + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelGeoAddPointOnGeometry + + !> Extrude the entities `dimTags' in the built-in CAD representation, using a + !! translation along (`dx', `dy', `dz'). Return extruded entities in + !! `outDimTags'. If `numElements' is not empty, also extrude the mesh: the + !! entries in `numElements' give the number of elements in each layer. If + !! `height' is not empty, it provides the (cumulative) height of the different + !! layers, normalized to 1. If `recombine' is set, recombine the mesh in the + !! layers. + subroutine gmshModelGeoExtrude(dimTags, dimTags_n, dx, dy, dz, outDimTags, outDimTags_n, numElements, numElements_n, heights, heights_n, recombine, ierr) bind(C, name="gmshModelGeoExtrude") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: dx + real(c_double), value :: dy + real(c_double), value :: dz + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + integer(c_int) :: numElements(*) + integer(c_size_t), value :: numElements_n + real(c_double) :: heights(*) + integer(c_size_t), value :: heights_n + integer(c_int), value :: recombine + integer(c_int) :: ierr + end subroutine gmshModelGeoExtrude + + !> Extrude the entities `dimTags' in the built-in CAD representation, using a + !! rotation of `angle' radians around the axis of revolution defined by the + !! point (`x', `y', `z') and the direction (`ax', `ay', `az'). The angle + !! should be strictly smaller than Pi. Return extruded entities in + !! `outDimTags'. If `numElements' is not empty, also extrude the mesh: the + !! entries in `numElements' give the number of elements in each layer. If + !! `height' is not empty, it provides the (cumulative) height of the different + !! layers, normalized to 1. If `recombine' is set, recombine the mesh in the + !! layers. + subroutine gmshModelGeoRevolve(dimTags, dimTags_n, x, y, z, ax, ay, az, angle, outDimTags, outDimTags_n, numElements, numElements_n, heights, heights_n, recombine, ierr) bind(C, name="gmshModelGeoRevolve") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + real(c_double), value :: ax + real(c_double), value :: ay + real(c_double), value :: az + real(c_double), value :: angle + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + integer(c_int) :: numElements(*) + integer(c_size_t), value :: numElements_n + real(c_double) :: heights(*) + integer(c_size_t), value :: heights_n + integer(c_int), value :: recombine + integer(c_int) :: ierr + end subroutine gmshModelGeoRevolve + + !> Extrude the entities `dimTags' in the built-in CAD representation, using a + !! combined translation and rotation of `angle' radians, along (`dx', `dy', + !! `dz') and around the axis of revolution defined by the point (`x', `y', + !! `z') and the direction (`ax', `ay', `az'). The angle should be strictly + !! smaller than Pi. Return extruded entities in `outDimTags'. If `numElements' + !! is not empty, also extrude the mesh: the entries in `numElements' give the + !! number of elements in each layer. If `height' is not empty, it provides the + !! (cumulative) height of the different layers, normalized to 1. If + !! `recombine' is set, recombine the mesh in the layers. + subroutine gmshModelGeoTwist(dimTags, dimTags_n, x, y, z, dx, dy, dz, ax, ay, az, angle, outDimTags, outDimTags_n, numElements, numElements_n, heights, heights_n, recombine, ierr) bind(C, name="gmshModelGeoTwist") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + real(c_double), value :: dx + real(c_double), value :: dy + real(c_double), value :: dz + real(c_double), value :: ax + real(c_double), value :: ay + real(c_double), value :: az + real(c_double), value :: angle + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + integer(c_int) :: numElements(*) + integer(c_size_t), value :: numElements_n + real(c_double) :: heights(*) + integer(c_size_t), value :: heights_n + integer(c_int), value :: recombine + integer(c_int) :: ierr + end subroutine gmshModelGeoTwist + + !> Extrude the entities `dimTags' in the built-in CAD representation along the + !! normals of the mesh, creating discrete boundary layer entities. Return + !! extruded entities in `outDimTags'. The entries in `numElements' give the + !! number of elements in each layer. If `height' is not empty, it provides the + !! (cumulative) height of the different layers. If `recombine' is set, + !! recombine the mesh in the layers. A second boundary layer can be created + !! from the same entities if `second' is set. If `viewIndex' is >= 0, use the + !! corresponding view to either specify the normals (if the view contains a + !! vector field) or scale the normals (if the view is scalar). + subroutine gmshModelGeoExtrudeBoundaryLayer(dimTags, dimTags_n, outDimTags, outDimTags_n, numElements, numElements_n, heights, heights_n, recombine, second, viewIndex, ierr) bind(C, name="gmshModelGeoExtrudeBoundaryLayer") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + integer(c_int) :: numElements(*) + integer(c_size_t), value :: numElements_n + real(c_double) :: heights(*) + integer(c_size_t), value :: heights_n + integer(c_int), value :: recombine + integer(c_int), value :: second + integer(c_int), value :: viewIndex + integer(c_int) :: ierr + end subroutine gmshModelGeoExtrudeBoundaryLayer + + !> Translate the entities `dimTags' in the built-in CAD representation along + !! (`dx', `dy', `dz'). + subroutine gmshModelGeoTranslate(dimTags, dimTags_n, dx, dy, dz, ierr) bind(C, name="gmshModelGeoTranslate") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: dx + real(c_double), value :: dy + real(c_double), value :: dz + integer(c_int) :: ierr + end subroutine gmshModelGeoTranslate + + !> Rotate the entities `dimTags' in the built-in CAD representation by `angle' + !! radians around the axis of revolution defined by the point (`x', `y', `z') + !! and the direction (`ax', `ay', `az'). + subroutine gmshModelGeoRotate(dimTags, dimTags_n, x, y, z, ax, ay, az, angle, ierr) bind(C, name="gmshModelGeoRotate") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + real(c_double), value :: ax + real(c_double), value :: ay + real(c_double), value :: az + real(c_double), value :: angle + integer(c_int) :: ierr + end subroutine gmshModelGeoRotate + + !> Scale the entities `dimTag' in the built-in CAD representation by factors + !! `a', `b' and `c' along the three coordinate axes; use (`x', `y', `z') as + !! the center of the homothetic transformation. + subroutine gmshModelGeoDilate(dimTags, dimTags_n, x, y, z, a, b, c, ierr) bind(C, name="gmshModelGeoDilate") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + real(c_double), value :: a + real(c_double), value :: b + real(c_double), value :: c + integer(c_int) :: ierr + end subroutine gmshModelGeoDilate + + !> Mirror the entities `dimTag' in the built-in CAD representation, with + !! respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0. + subroutine gmshModelGeoMirror(dimTags, dimTags_n, a, b, c, d, ierr) bind(C, name="gmshModelGeoMirror") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: a + real(c_double), value :: b + real(c_double), value :: c + real(c_double), value :: d + integer(c_int) :: ierr + end subroutine gmshModelGeoMirror + + !> Mirror the entities `dimTag' in the built-in CAD representation, with + !! respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0. + !! (This is a synonym for `mirror', which will be deprecated in a future + !! release.) + subroutine gmshModelGeoSymmetrize(dimTags, dimTags_n, a, b, c, d, ierr) bind(C, name="gmshModelGeoSymmetrize") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: a + real(c_double), value :: b + real(c_double), value :: c + real(c_double), value :: d + integer(c_int) :: ierr + end subroutine gmshModelGeoSymmetrize + + !> Copy the entities `dimTags' in the built-in CAD representation; the new + !! entities are returned in `outDimTags'. + subroutine gmshModelGeoCopy(dimTags, dimTags_n, outDimTags, outDimTags_n, ierr) bind(C, name="gmshModelGeoCopy") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + integer(c_int) :: ierr + end subroutine gmshModelGeoCopy + + !> Remove the entities `dimTags' in the built-in CAD representation, provided + !! that they are not on the boundary of higher-dimensional entities. If + !! `recursive' is true, remove all the entities on their boundaries, down to + !! dimension 0. + subroutine gmshModelGeoRemove(dimTags, dimTags_n, recursive, ierr) bind(C, name="gmshModelGeoRemove") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int), value :: recursive + integer(c_int) :: ierr + end subroutine gmshModelGeoRemove + + !> Remove all duplicate entities in the built-in CAD representation (different + !! entities at the same geometrical location). + subroutine gmshModelGeoRemoveAllDuplicates(ierr) bind(C, name="gmshModelGeoRemoveAllDuplicates") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshModelGeoRemoveAllDuplicates + + !> Split the curve of tag `tag' in the built-in CAD representation, on the + !! specified control points `pointTags'. This feature is only available for + !! lines, splines and b-splines. Return the tag(s) `curveTags' of the newly + !! created curve(s). + subroutine gmshModelGeoSplitCurve(tag, pointTags, pointTags_n, curveTags, curveTags_n, ierr) bind(C, name="gmshModelGeoSplitCurve") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + integer(c_int) :: pointTags(*) + integer(c_size_t), value :: pointTags_n + type(c_ptr), intent(out) :: curveTags + integer(c_size_t) :: curveTags_n + integer(c_int) :: ierr + end subroutine gmshModelGeoSplitCurve + + !> Get the maximum tag of entities of dimension `dim' in the built-in CAD + !! representation. + function gmshModelGeoGetMaxTag(dim, ierr) bind(C, name="gmshModelGeoGetMaxTag") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGeoGetMaxTag + integer(c_int), value :: dim + integer(c_int) :: ierr + end function gmshModelGeoGetMaxTag + + !> Set the maximum tag `maxTag' for entities of dimension `dim' in the built- + !! in CAD representation. + subroutine gmshModelGeoSetMaxTag(dim, maxTag, ierr) bind(C, name="gmshModelGeoSetMaxTag") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: maxTag + integer(c_int) :: ierr + end subroutine gmshModelGeoSetMaxTag + + !> Add a physical group of dimension `dim', grouping the entities with tags + !! `tags' in the built-in CAD representation. Return the tag of the physical + !! group, equal to `tag' if `tag' is positive, or a new tag if `tag' < 0. Set + !! the name of the physical group if `name' is not empty. + function gmshModelGeoAddPhysicalGroup(dim, tags, tags_n, tag, name, ierr) bind(C, name="gmshModelGeoAddPhysicalGroup") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelGeoAddPhysicalGroup + integer(c_int), value :: dim + integer(c_int) :: tags(*) + integer(c_size_t), value :: tags_n + integer(c_int), value :: tag + character(len=1, kind=c_char) :: name(*) + integer(c_int) :: ierr + end function gmshModelGeoAddPhysicalGroup + + !> Remove the physical groups `dimTags' from the built-in CAD representation. + !! If `dimTags' is empty, remove all groups. + subroutine gmshModelGeoRemovePhysicalGroups(dimTags, dimTags_n, ierr) bind(C, name="gmshModelGeoRemovePhysicalGroups") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int) :: ierr + end subroutine gmshModelGeoRemovePhysicalGroups + + !> Synchronize the built-in CAD representation with the current Gmsh model. + !! This can be called at any time, but since it involves a non trivial amount + !! of processing, the number of synchronization points should normally be + !! minimized. Without synchronization the entities in the built-in CAD + !! representation are not available to any function outside of the built-in + !! CAD kernel functions. + subroutine gmshModelGeoSynchronize(ierr) bind(C, name="gmshModelGeoSynchronize") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshModelGeoSynchronize + + !> Set a mesh size constraint on the entities `dimTags' in the built-in CAD + !! kernel representation. Currently only entities of dimension 0 (points) are + !! handled. + subroutine gmshModelGeoMeshSetSize(dimTags, dimTags_n, size, ierr) bind(C, name="gmshModelGeoMeshSetSize") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: size + integer(c_int) :: ierr + end subroutine gmshModelGeoMeshSetSize + + !> Set a transfinite meshing constraint on the curve `tag' in the built-in CAD + !! kernel representation, with `numNodes' nodes distributed according to + !! `meshType' and `coef'. Currently supported types are "Progression" + !! (geometrical progression with power `coef') and "Bump" (refinement toward + !! both extremities of the curve). + subroutine gmshModelGeoMeshSetTransfiniteCurve(tag, nPoints, meshType, coef, ierr) bind(C, name="gmshModelGeoMeshSetTransfiniteCurve") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + integer(c_int), value :: nPoints + character(len=1, kind=c_char) :: meshType(*) + real(c_double), value :: coef + integer(c_int) :: ierr + end subroutine gmshModelGeoMeshSetTransfiniteCurve + + !> Set a transfinite meshing constraint on the surface `tag' in the built-in + !! CAD kernel representation. `arrangement' describes the arrangement of the + !! triangles when the surface is not flagged as recombined: currently + !! supported values are "Left", "Right", "AlternateLeft" and "AlternateRight". + !! `cornerTags' can be used to specify the (3 or 4) corners of the transfinite + !! interpolation explicitly; specifying the corners explicitly is mandatory if + !! the surface has more that 3 or 4 points on its boundary. + subroutine gmshModelGeoMeshSetTransfiniteSurface(tag, arrangement, cornerTags, cornerTags_n, ierr) bind(C, name="gmshModelGeoMeshSetTransfiniteSurface") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + character(len=1, kind=c_char) :: arrangement(*) + integer(c_int) :: cornerTags(*) + integer(c_size_t), value :: cornerTags_n + integer(c_int) :: ierr + end subroutine gmshModelGeoMeshSetTransfiniteSurface + + !> Set a transfinite meshing constraint on the surface `tag' in the built-in + !! CAD kernel representation. `cornerTags' can be used to specify the (6 or 8) + !! corners of the transfinite interpolation explicitly. + subroutine gmshModelGeoMeshSetTransfiniteVolume(tag, cornerTags, cornerTags_n, ierr) bind(C, name="gmshModelGeoMeshSetTransfiniteVolume") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + integer(c_int) :: cornerTags(*) + integer(c_size_t), value :: cornerTags_n + integer(c_int) :: ierr + end subroutine gmshModelGeoMeshSetTransfiniteVolume + + !> Set a recombination meshing constraint on the entity of dimension `dim' and + !! tag `tag' in the built-in CAD kernel representation. Currently only + !! entities of dimension 2 (to recombine triangles into quadrangles) are + !! supported; `angle' specifies the threshold angle for the simple + !! recombination algorithm. + subroutine gmshModelGeoMeshSetRecombine(dim, tag, angle, ierr) bind(C, name="gmshModelGeoMeshSetRecombine") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + real(c_double), value :: angle + integer(c_int) :: ierr + end subroutine gmshModelGeoMeshSetRecombine + + !> Set a smoothing meshing constraint on the entity of dimension `dim' and tag + !! `tag' in the built-in CAD kernel representation. `val' iterations of a + !! Laplace smoother are applied. + subroutine gmshModelGeoMeshSetSmoothing(dim, tag, val, ierr) bind(C, name="gmshModelGeoMeshSetSmoothing") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int), value :: val + integer(c_int) :: ierr + end subroutine gmshModelGeoMeshSetSmoothing + + !> Set a reverse meshing constraint on the entity of dimension `dim' and tag + !! `tag' in the built-in CAD kernel representation. If `val' is true, the mesh + !! orientation will be reversed with respect to the natural mesh orientation + !! (i.e. the orientation consistent with the orientation of the geometry). If + !! `val' is false, the mesh is left as-is. + subroutine gmshModelGeoMeshSetReverse(dim, tag, val, ierr) bind(C, name="gmshModelGeoMeshSetReverse") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int), value :: val + integer(c_int) :: ierr + end subroutine gmshModelGeoMeshSetReverse + + !> Set the meshing algorithm on the entity of dimension `dim' and tag `tag' in + !! the built-in CAD kernel representation. Currently only supported for `dim' + !! == 2. + subroutine gmshModelGeoMeshSetAlgorithm(dim, tag, val, ierr) bind(C, name="gmshModelGeoMeshSetAlgorithm") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int), value :: val + integer(c_int) :: ierr + end subroutine gmshModelGeoMeshSetAlgorithm + + !> Force the mesh size to be extended from the boundary, or not, for the + !! entity of dimension `dim' and tag `tag' in the built-in CAD kernel + !! representation. Currently only supported for `dim' == 2. + subroutine gmshModelGeoMeshSetSizeFromBoundary(dim, tag, val, ierr) bind(C, name="gmshModelGeoMeshSetSizeFromBoundary") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int), value :: val + integer(c_int) :: ierr + end subroutine gmshModelGeoMeshSetSizeFromBoundary + + !> Add a geometrical point in the OpenCASCADE CAD representation, at + !! coordinates (`x', `y', `z'). If `meshSize' is > 0, add a meshing constraint + !! at that point. If `tag' is positive, set the tag explicitly; otherwise a + !! new tag is selected automatically. Return the tag of the point. (Note that + !! the point will be added in the current model only after `synchronize' is + !! called. This behavior holds for all the entities added in the occ module.) + function gmshModelOccAddPoint(x, y, z, meshSize, tag, ierr) bind(C, name="gmshModelOccAddPoint") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddPoint + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + real(c_double), value :: meshSize + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelOccAddPoint + + !> Add a straight line segment in the OpenCASCADE CAD representation, between + !! the two points with tags `startTag' and `endTag'. If `tag' is positive, set + !! the tag explicitly; otherwise a new tag is selected automatically. Return + !! the tag of the line. + function gmshModelOccAddLine(startTag, endTag, tag, ierr) bind(C, name="gmshModelOccAddLine") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddLine + integer(c_int), value :: startTag + integer(c_int), value :: endTag + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelOccAddLine + + !> Add a circle arc in the OpenCASCADE CAD representation, between the two + !! points with tags `startTag' and `endTag', with center `centerTag'. If `tag' + !! is positive, set the tag explicitly; otherwise a new tag is selected + !! automatically. Return the tag of the circle arc. + function gmshModelOccAddCircleArc(startTag, centerTag, endTag, tag, ierr) bind(C, name="gmshModelOccAddCircleArc") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddCircleArc + integer(c_int), value :: startTag + integer(c_int), value :: centerTag + integer(c_int), value :: endTag + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelOccAddCircleArc + + !> Add a circle of center (`x', `y', `z') and radius `r' in the OpenCASCADE + !! CAD representation. If `tag' is positive, set the tag explicitly; otherwise + !! a new tag is selected automatically. If `angle1' and `angle2' are + !! specified, create a circle arc between the two angles. If a vector `zAxis' + !! of size 3 is provided, use it as the normal to the circle plane (z-axis). + !! If a vector `xAxis' of size 3 is provided in addition to `zAxis', use it to + !! define the x-axis. Return the tag of the circle. + function gmshModelOccAddCircle(x, y, z, r, tag, angle1, angle2, zAxis, zAxis_n, xAxis, xAxis_n, ierr) bind(C, name="gmshModelOccAddCircle") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddCircle + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + real(c_double), value :: r + integer(c_int), value :: tag + real(c_double), value :: angle1 + real(c_double), value :: angle2 + real(c_double) :: zAxis(*) + integer(c_size_t), value :: zAxis_n + real(c_double) :: xAxis(*) + integer(c_size_t), value :: xAxis_n + integer(c_int) :: ierr + end function gmshModelOccAddCircle + + !> Add an ellipse arc in the OpenCASCADE CAD representation, between the two + !! points `startTag' and `endTag', and with center `centerTag' and major axis + !! point `majorTag'. If `tag' is positive, set the tag explicitly; otherwise a + !! new tag is selected automatically. Return the tag of the ellipse arc. Note + !! that OpenCASCADE does not allow creating ellipse arcs with the major radius + !! smaller than the minor radius. + function gmshModelOccAddEllipseArc(startTag, centerTag, majorTag, endTag, tag, ierr) bind(C, name="gmshModelOccAddEllipseArc") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddEllipseArc + integer(c_int), value :: startTag + integer(c_int), value :: centerTag + integer(c_int), value :: majorTag + integer(c_int), value :: endTag + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelOccAddEllipseArc + + !> Add an ellipse of center (`x', `y', `z') and radii `r1' and `r2' (with `r1' + !! >= `r2') along the x- and y-axes, respectively, in the OpenCASCADE CAD + !! representation. If `tag' is positive, set the tag explicitly; otherwise a + !! new tag is selected automatically. If `angle1' and `angle2' are specified, + !! create an ellipse arc between the two angles. If a vector `zAxis' of size 3 + !! is provided, use it as the normal to the ellipse plane (z-axis). If a + !! vector `xAxis' of size 3 is provided in addition to `zAxis', use it to + !! define the x-axis. Return the tag of the ellipse. + function gmshModelOccAddEllipse(x, y, z, r1, r2, tag, angle1, angle2, zAxis, zAxis_n, xAxis, xAxis_n, ierr) bind(C, name="gmshModelOccAddEllipse") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddEllipse + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + real(c_double), value :: r1 + real(c_double), value :: r2 + integer(c_int), value :: tag + real(c_double), value :: angle1 + real(c_double), value :: angle2 + real(c_double) :: zAxis(*) + integer(c_size_t), value :: zAxis_n + real(c_double) :: xAxis(*) + integer(c_size_t), value :: xAxis_n + integer(c_int) :: ierr + end function gmshModelOccAddEllipse + + !> Add a spline (C2 b-spline) curve in the OpenCASCADE CAD representation, + !! going through the points `pointTags'. If `tag' is positive, set the tag + !! explicitly; otherwise a new tag is selected automatically. Create a + !! periodic curve if the first and last points are the same. Return the tag of + !! the spline curve. + function gmshModelOccAddSpline(pointTags, pointTags_n, tag, ierr) bind(C, name="gmshModelOccAddSpline") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddSpline + integer(c_int) :: pointTags(*) + integer(c_size_t), value :: pointTags_n + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelOccAddSpline + + !> Add a b-spline curve of degree `degree' in the OpenCASCADE CAD + !! representation, with `pointTags' control points. If `weights', `knots' or + !! `multiplicities' are not provided, default parameters are computed + !! automatically. If `tag' is positive, set the tag explicitly; otherwise a + !! new tag is selected automatically. Create a periodic curve if the first and + !! last points are the same. Return the tag of the b-spline curve. + function gmshModelOccAddBSpline(pointTags, pointTags_n, tag, degree, weights, weights_n, knots, knots_n, multiplicities, multiplicities_n, ierr) bind(C, name="gmshModelOccAddBSpline") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddBSpline + integer(c_int) :: pointTags(*) + integer(c_size_t), value :: pointTags_n + integer(c_int), value :: tag + integer(c_int), value :: degree + real(c_double) :: weights(*) + integer(c_size_t), value :: weights_n + real(c_double) :: knots(*) + integer(c_size_t), value :: knots_n + integer(c_int) :: multiplicities(*) + integer(c_size_t), value :: multiplicities_n + integer(c_int) :: ierr + end function gmshModelOccAddBSpline + + !> Add a Bezier curve in the OpenCASCADE CAD representation, with `pointTags' + !! control points. If `tag' is positive, set the tag explicitly; otherwise a + !! new tag is selected automatically. Return the tag of the Bezier curve. + function gmshModelOccAddBezier(pointTags, pointTags_n, tag, ierr) bind(C, name="gmshModelOccAddBezier") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddBezier + integer(c_int) :: pointTags(*) + integer(c_size_t), value :: pointTags_n + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelOccAddBezier + + !> Add a wire (open or closed) in the OpenCASCADE CAD representation, formed + !! by the curves `curveTags'. Note that an OpenCASCADE wire can be made of + !! curves that share geometrically identical (but topologically different) + !! points. If `tag' is positive, set the tag explicitly; otherwise a new tag + !! is selected automatically. Return the tag of the wire. + function gmshModelOccAddWire(curveTags, curveTags_n, tag, checkClosed, ierr) bind(C, name="gmshModelOccAddWire") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddWire + integer(c_int) :: curveTags(*) + integer(c_size_t), value :: curveTags_n + integer(c_int), value :: tag + integer(c_int), value :: checkClosed + integer(c_int) :: ierr + end function gmshModelOccAddWire + + !> Add a curve loop (a closed wire) in the OpenCASCADE CAD representation, + !! formed by the curves `curveTags'. `curveTags' should contain tags of curves + !! forming a closed loop. Negative tags can be specified for compatibility + !! with the built-in kernel, but are simply ignored: the wire is oriented + !! according to the orientation of its first curve. Note that an OpenCASCADE + !! curve loop can be made of curves that share geometrically identical (but + !! topologically different) points. If `tag' is positive, set the tag + !! explicitly; otherwise a new tag is selected automatically. Return the tag + !! of the curve loop. + function gmshModelOccAddCurveLoop(curveTags, curveTags_n, tag, ierr) bind(C, name="gmshModelOccAddCurveLoop") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddCurveLoop + integer(c_int) :: curveTags(*) + integer(c_size_t), value :: curveTags_n + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelOccAddCurveLoop + + !> Add a rectangle in the OpenCASCADE CAD representation, with lower left + !! corner at (`x', `y', `z') and upper right corner at (`x' + `dx', `y' + + !! `dy', `z'). If `tag' is positive, set the tag explicitly; otherwise a new + !! tag is selected automatically. Round the corners if `roundedRadius' is + !! nonzero. Return the tag of the rectangle. + function gmshModelOccAddRectangle(x, y, z, dx, dy, tag, roundedRadius, ierr) bind(C, name="gmshModelOccAddRectangle") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddRectangle + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + real(c_double), value :: dx + real(c_double), value :: dy + integer(c_int), value :: tag + real(c_double), value :: roundedRadius + integer(c_int) :: ierr + end function gmshModelOccAddRectangle + + !> Add a disk in the OpenCASCADE CAD representation, with center (`xc', `yc', + !! `zc') and radius `rx' along the x-axis and `ry' along the y-axis (`rx' >= + !! `ry'). If `tag' is positive, set the tag explicitly; otherwise a new tag is + !! selected automatically. If a vector `zAxis' of size 3 is provided, use it + !! as the normal to the disk (z-axis). If a vector `xAxis' of size 3 is + !! provided in addition to `zAxis', use it to define the x-axis. Return the + !! tag of the disk. + function gmshModelOccAddDisk(xc, yc, zc, rx, ry, tag, zAxis, zAxis_n, xAxis, xAxis_n, ierr) bind(C, name="gmshModelOccAddDisk") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddDisk + real(c_double), value :: xc + real(c_double), value :: yc + real(c_double), value :: zc + real(c_double), value :: rx + real(c_double), value :: ry + integer(c_int), value :: tag + real(c_double) :: zAxis(*) + integer(c_size_t), value :: zAxis_n + real(c_double) :: xAxis(*) + integer(c_size_t), value :: xAxis_n + integer(c_int) :: ierr + end function gmshModelOccAddDisk + + !> Add a plane surface in the OpenCASCADE CAD representation, defined by one + !! or more curve loops (or closed wires) `wireTags'. The first curve loop + !! defines the exterior contour; additional curve loop define holes. If `tag' + !! is positive, set the tag explicitly; otherwise a new tag is selected + !! automatically. Return the tag of the surface. + function gmshModelOccAddPlaneSurface(wireTags, wireTags_n, tag, ierr) bind(C, name="gmshModelOccAddPlaneSurface") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddPlaneSurface + integer(c_int) :: wireTags(*) + integer(c_size_t), value :: wireTags_n + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelOccAddPlaneSurface + + !> Add a surface in the OpenCASCADE CAD representation, filling the curve loop + !! `wireTag'. If `tag' is positive, set the tag explicitly; otherwise a new + !! tag is selected automatically. Return the tag of the surface. If + !! `pointTags' are provided, force the surface to pass through the given + !! points. The other optional arguments are `degree' (the degree of the energy + !! criterion to minimize for computing the deformation of the surface), + !! `numPointsOnCurves' (the average number of points for discretisation of the + !! bounding curves), `numIter' (the maximum number of iterations of the + !! optimization process), `anisotropic' (improve performance when the ratio of + !! the length along the two parametric coordinates of the surface is high), + !! `tol2d' (tolerance to the constraints in the parametric plane of the + !! surface), `tol3d' (the maximum distance allowed between the support surface + !! and the constraints), `tolAng' (the maximum angle allowed between the + !! normal of the surface and the constraints), `tolCurv' (the maximum + !! difference of curvature allowed between the surface and the constraint), + !! `maxDegree' (the highest degree which the polynomial defining the filling + !! surface can have) and, `maxSegments' (the largest number of segments which + !! the filling surface can have). + function gmshModelOccAddSurfaceFilling(wireTag, tag, pointTags, pointTags_n, degree, numPointsOnCurves, numIter, anisotropic, tol2d, tol3d, tolAng, tolCurv, maxDegree, maxSegments, ierr) bind(C, name="gmshModelOccAddSurfaceFilling") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddSurfaceFilling + integer(c_int), value :: wireTag + integer(c_int), value :: tag + integer(c_int) :: pointTags(*) + integer(c_size_t), value :: pointTags_n + integer(c_int), value :: degree + integer(c_int), value :: numPointsOnCurves + integer(c_int), value :: numIter + integer(c_int), value :: anisotropic + real(c_double), value :: tol2d + real(c_double), value :: tol3d + real(c_double), value :: tolAng + real(c_double), value :: tolCurv + integer(c_int), value :: maxDegree + integer(c_int), value :: maxSegments + integer(c_int) :: ierr + end function gmshModelOccAddSurfaceFilling + + !> Add a BSpline surface in the OpenCASCADE CAD representation, filling the + !! curve loop `wireTag'. The curve loop should be made of 2, 3 or 4 curves. + !! The optional `type' argument specifies the type of filling: "Stretch" + !! creates the flattest patch, "Curved" (the default) creates the most rounded + !! patch, and "Coons" creates a rounded patch with less depth than "Curved". + !! If `tag' is positive, set the tag explicitly; otherwise a new tag is + !! selected automatically. Return the tag of the surface. + function gmshModelOccAddBSplineFilling(wireTag, tag, type, ierr) bind(C, name="gmshModelOccAddBSplineFilling") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddBSplineFilling + integer(c_int), value :: wireTag + integer(c_int), value :: tag + character(len=1, kind=c_char) :: type(*) + integer(c_int) :: ierr + end function gmshModelOccAddBSplineFilling + + !> Add a Bezier surface in the OpenCASCADE CAD representation, filling the + !! curve loop `wireTag'. The curve loop should be made of 2, 3 or 4 Bezier + !! curves. The optional `type' argument specifies the type of filling: + !! "Stretch" creates the flattest patch, "Curved" (the default) creates the + !! most rounded patch, and "Coons" creates a rounded patch with less depth + !! than "Curved". If `tag' is positive, set the tag explicitly; otherwise a + !! new tag is selected automatically. Return the tag of the surface. + function gmshModelOccAddBezierFilling(wireTag, tag, type, ierr) bind(C, name="gmshModelOccAddBezierFilling") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddBezierFilling + integer(c_int), value :: wireTag + integer(c_int), value :: tag + character(len=1, kind=c_char) :: type(*) + integer(c_int) :: ierr + end function gmshModelOccAddBezierFilling + + !> Add a b-spline surface of degree `degreeU' x `degreeV' in the OpenCASCADE + !! CAD representation, with `pointTags' control points given as a single + !! vector [Pu1v1, ... Pu`numPointsU'v1, Pu1v2, ...]. If `weights', `knotsU', + !! `knotsV', `multiplicitiesU' or `multiplicitiesV' are not provided, default + !! parameters are computed automatically. If `tag' is positive, set the tag + !! explicitly; otherwise a new tag is selected automatically. If `wireTags' is + !! provided, trim the b-spline patch using the provided wires: the first wire + !! defines the external contour, the others define holes. If `wire3D' is set, + !! consider wire curves as 3D curves and project them on the b-spline surface; + !! otherwise consider the wire curves as defined in the parametric space of + !! the surface. Return the tag of the b-spline surface. + function gmshModelOccAddBSplineSurface(pointTags, pointTags_n, numPointsU, tag, degreeU, degreeV, weights, weights_n, knotsU, knotsU_n, knotsV, knotsV_n, multiplicitiesU, multiplicitiesU_n, multiplicitiesV, multiplicitiesV_n, wireTags, wireTags_n, wire3D, ierr) bind(C, name="gmshModelOccAddBSplineSurface") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddBSplineSurface + integer(c_int) :: pointTags(*) + integer(c_size_t), value :: pointTags_n + integer(c_int), value :: numPointsU + integer(c_int), value :: tag + integer(c_int), value :: degreeU + integer(c_int), value :: degreeV + real(c_double) :: weights(*) + integer(c_size_t), value :: weights_n + real(c_double) :: knotsU(*) + integer(c_size_t), value :: knotsU_n + real(c_double) :: knotsV(*) + integer(c_size_t), value :: knotsV_n + integer(c_int) :: multiplicitiesU(*) + integer(c_size_t), value :: multiplicitiesU_n + integer(c_int) :: multiplicitiesV(*) + integer(c_size_t), value :: multiplicitiesV_n + integer(c_int) :: wireTags(*) + integer(c_size_t), value :: wireTags_n + integer(c_int), value :: wire3D + integer(c_int) :: ierr + end function gmshModelOccAddBSplineSurface + + !> Add a Bezier surface in the OpenCASCADE CAD representation, with + !! `pointTags' control points given as a single vector [Pu1v1, ... + !! Pu`numPointsU'v1, Pu1v2, ...]. If `tag' is positive, set the tag + !! explicitly; otherwise a new tag is selected automatically. If `wireTags' is + !! provided, trim the Bezier patch using the provided wires: the first wire + !! defines the external contour, the others define holes. If `wire3D' is set, + !! consider wire curves as 3D curves and project them on the Bezier surface; + !! otherwise consider the wire curves as defined in the parametric space of + !! the surface. Return the tag of the Bezier surface. + function gmshModelOccAddBezierSurface(pointTags, pointTags_n, numPointsU, tag, wireTags, wireTags_n, wire3D, ierr) bind(C, name="gmshModelOccAddBezierSurface") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddBezierSurface + integer(c_int) :: pointTags(*) + integer(c_size_t), value :: pointTags_n + integer(c_int), value :: numPointsU + integer(c_int), value :: tag + integer(c_int) :: wireTags(*) + integer(c_size_t), value :: wireTags_n + integer(c_int), value :: wire3D + integer(c_int) :: ierr + end function gmshModelOccAddBezierSurface + + !> Trim the surface `surfaceTag' with the wires `wireTags', replacing any + !! existing trimming curves. The first wire defines the external contour, the + !! others define holes. If `wire3D' is set, consider wire curves as 3D curves + !! and project them on the surface; otherwise consider the wire curves as + !! defined in the parametric space of the surface. If `tag' is positive, set + !! the tag explicitly; otherwise a new tag is selected automatically. Return + !! the tag of the trimmed surface. + function gmshModelOccAddTrimmedSurface(surfaceTag, wireTags, wireTags_n, wire3D, tag, ierr) bind(C, name="gmshModelOccAddTrimmedSurface") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddTrimmedSurface + integer(c_int), value :: surfaceTag + integer(c_int) :: wireTags(*) + integer(c_size_t), value :: wireTags_n + integer(c_int), value :: wire3D + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelOccAddTrimmedSurface + + !> Add a surface loop (a closed shell) in the OpenCASCADE CAD representation, + !! formed by `surfaceTags'. If `tag' is positive, set the tag explicitly; + !! otherwise a new tag is selected automatically. Return the tag of the + !! surface loop. Setting `sewing' allows one to build a shell made of surfaces + !! that share geometrically identical (but topologically different) curves. + function gmshModelOccAddSurfaceLoop(surfaceTags, surfaceTags_n, tag, sewing, ierr) bind(C, name="gmshModelOccAddSurfaceLoop") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddSurfaceLoop + integer(c_int) :: surfaceTags(*) + integer(c_size_t), value :: surfaceTags_n + integer(c_int), value :: tag + integer(c_int), value :: sewing + integer(c_int) :: ierr + end function gmshModelOccAddSurfaceLoop + + !> Add a volume (a region) in the OpenCASCADE CAD representation, defined by + !! one or more surface loops `shellTags'. The first surface loop defines the + !! exterior boundary; additional surface loop define holes. If `tag' is + !! positive, set the tag explicitly; otherwise a new tag is selected + !! automatically. Return the tag of the volume. + function gmshModelOccAddVolume(shellTags, shellTags_n, tag, ierr) bind(C, name="gmshModelOccAddVolume") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddVolume + integer(c_int) :: shellTags(*) + integer(c_size_t), value :: shellTags_n + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelOccAddVolume + + !> Add a sphere of center (`xc', `yc', `zc') and radius `r' in the OpenCASCADE + !! CAD representation. The optional `angle1' and `angle2' arguments define the + !! polar angle opening (from -Pi/2 to Pi/2). The optional `angle3' argument + !! defines the azimuthal opening (from 0 to 2*Pi). If `tag' is positive, set + !! the tag explicitly; otherwise a new tag is selected automatically. Return + !! the tag of the sphere. + function gmshModelOccAddSphere(xc, yc, zc, radius, tag, angle1, angle2, angle3, ierr) bind(C, name="gmshModelOccAddSphere") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddSphere + real(c_double), value :: xc + real(c_double), value :: yc + real(c_double), value :: zc + real(c_double), value :: radius + integer(c_int), value :: tag + real(c_double), value :: angle1 + real(c_double), value :: angle2 + real(c_double), value :: angle3 + integer(c_int) :: ierr + end function gmshModelOccAddSphere + + !> Add a parallelepipedic box in the OpenCASCADE CAD representation, defined + !! by a point (`x', `y', `z') and the extents along the x-, y- and z-axes. If + !! `tag' is positive, set the tag explicitly; otherwise a new tag is selected + !! automatically. Return the tag of the box. + function gmshModelOccAddBox(x, y, z, dx, dy, dz, tag, ierr) bind(C, name="gmshModelOccAddBox") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddBox + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + real(c_double), value :: dx + real(c_double), value :: dy + real(c_double), value :: dz + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshModelOccAddBox + + !> Add a cylinder in the OpenCASCADE CAD representation, defined by the center + !! (`x', `y', `z') of its first circular face, the 3 components (`dx', `dy', + !! `dz') of the vector defining its axis and its radius `r'. The optional + !! `angle' argument defines the angular opening (from 0 to 2*Pi). If `tag' is + !! positive, set the tag explicitly; otherwise a new tag is selected + !! automatically. Return the tag of the cylinder. + function gmshModelOccAddCylinder(x, y, z, dx, dy, dz, r, tag, angle, ierr) bind(C, name="gmshModelOccAddCylinder") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddCylinder + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + real(c_double), value :: dx + real(c_double), value :: dy + real(c_double), value :: dz + real(c_double), value :: r + integer(c_int), value :: tag + real(c_double), value :: angle + integer(c_int) :: ierr + end function gmshModelOccAddCylinder + + !> Add a cone in the OpenCASCADE CAD representation, defined by the center + !! (`x', `y', `z') of its first circular face, the 3 components of the vector + !! (`dx', `dy', `dz') defining its axis and the two radii `r1' and `r2' of the + !! faces (these radii can be zero). If `tag' is positive, set the tag + !! explicitly; otherwise a new tag is selected automatically. `angle' defines + !! the optional angular opening (from 0 to 2*Pi). Return the tag of the cone. + function gmshModelOccAddCone(x, y, z, dx, dy, dz, r1, r2, tag, angle, ierr) bind(C, name="gmshModelOccAddCone") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddCone + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + real(c_double), value :: dx + real(c_double), value :: dy + real(c_double), value :: dz + real(c_double), value :: r1 + real(c_double), value :: r2 + integer(c_int), value :: tag + real(c_double), value :: angle + integer(c_int) :: ierr + end function gmshModelOccAddCone + + !> Add a right angular wedge in the OpenCASCADE CAD representation, defined by + !! the right-angle point (`x', `y', `z') and the 3 extends along the x-, y- + !! and z-axes (`dx', `dy', `dz'). If `tag' is positive, set the tag + !! explicitly; otherwise a new tag is selected automatically. The optional + !! argument `ltx' defines the top extent along the x-axis. If a vector `zAxis' + !! of size 3 is provided, use it to define the z-axis. Return the tag of the + !! wedge. + function gmshModelOccAddWedge(x, y, z, dx, dy, dz, tag, ltx, zAxis, zAxis_n, ierr) bind(C, name="gmshModelOccAddWedge") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddWedge + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + real(c_double), value :: dx + real(c_double), value :: dy + real(c_double), value :: dz + integer(c_int), value :: tag + real(c_double), value :: ltx + real(c_double) :: zAxis(*) + integer(c_size_t), value :: zAxis_n + integer(c_int) :: ierr + end function gmshModelOccAddWedge + + !> Add a torus in the OpenCASCADE CAD representation, defined by its center + !! (`x', `y', `z') and its 2 radii `r' and `r2'. If `tag' is positive, set the + !! tag explicitly; otherwise a new tag is selected automatically. The optional + !! argument `angle' defines the angular opening (from 0 to 2*Pi). If a vector + !! `zAxis' of size 3 is provided, use it to define the z-axis. Return the tag + !! of the torus. + function gmshModelOccAddTorus(x, y, z, r1, r2, tag, angle, zAxis, zAxis_n, ierr) bind(C, name="gmshModelOccAddTorus") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccAddTorus + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + real(c_double), value :: r1 + real(c_double), value :: r2 + integer(c_int), value :: tag + real(c_double), value :: angle + real(c_double) :: zAxis(*) + integer(c_size_t), value :: zAxis_n + integer(c_int) :: ierr + end function gmshModelOccAddTorus + + !> Add a volume (if the optional argument `makeSolid' is set) or surfaces in + !! the OpenCASCADE CAD representation, defined through the open or closed + !! wires `wireTags'. If `tag' is positive, set the tag explicitly; otherwise a + !! new tag is selected automatically. The new entities are returned in + !! `outDimTags'. If the optional argument `makeRuled' is set, the surfaces + !! created on the boundary are forced to be ruled surfaces. If `maxDegree' is + !! positive, set the maximal degree of resulting surface. + subroutine gmshModelOccAddThruSections(wireTags, wireTags_n, outDimTags, outDimTags_n, tag, makeSolid, makeRuled, maxDegree, ierr) bind(C, name="gmshModelOccAddThruSections") + use, intrinsic :: iso_c_binding + integer(c_int) :: wireTags(*) + integer(c_size_t), value :: wireTags_n + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + integer(c_int), value :: tag + integer(c_int), value :: makeSolid + integer(c_int), value :: makeRuled + integer(c_int), value :: maxDegree + integer(c_int) :: ierr + end subroutine gmshModelOccAddThruSections + + !> Add a hollowed volume in the OpenCASCADE CAD representation, built from an + !! initial volume `volumeTag' and a set of faces from this volume + !! `excludeSurfaceTags', which are to be removed. The remaining faces of the + !! volume become the walls of the hollowed solid, with thickness `offset'. If + !! `tag' is positive, set the tag explicitly; otherwise a new tag is selected + !! automatically. + subroutine gmshModelOccAddThickSolid(volumeTag, excludeSurfaceTags, excludeSurfaceTags_n, offset, outDimTags, outDimTags_n, tag, ierr) bind(C, name="gmshModelOccAddThickSolid") + use, intrinsic :: iso_c_binding + integer(c_int), value :: volumeTag + integer(c_int) :: excludeSurfaceTags(*) + integer(c_size_t), value :: excludeSurfaceTags_n + real(c_double), value :: offset + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + integer(c_int), value :: tag + integer(c_int) :: ierr + end subroutine gmshModelOccAddThickSolid + + !> Extrude the entities `dimTags' in the OpenCASCADE CAD representation, using + !! a translation along (`dx', `dy', `dz'). Return extruded entities in + !! `outDimTags'. If `numElements' is not empty, also extrude the mesh: the + !! entries in `numElements' give the number of elements in each layer. If + !! `height' is not empty, it provides the (cumulative) height of the different + !! layers, normalized to 1. If `recombine' is set, recombine the mesh in the + !! layers. + subroutine gmshModelOccExtrude(dimTags, dimTags_n, dx, dy, dz, outDimTags, outDimTags_n, numElements, numElements_n, heights, heights_n, recombine, ierr) bind(C, name="gmshModelOccExtrude") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: dx + real(c_double), value :: dy + real(c_double), value :: dz + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + integer(c_int) :: numElements(*) + integer(c_size_t), value :: numElements_n + real(c_double) :: heights(*) + integer(c_size_t), value :: heights_n + integer(c_int), value :: recombine + integer(c_int) :: ierr + end subroutine gmshModelOccExtrude + + !> Extrude the entities `dimTags' in the OpenCASCADE CAD representation, using + !! a rotation of `angle' radians around the axis of revolution defined by the + !! point (`x', `y', `z') and the direction (`ax', `ay', `az'). Return extruded + !! entities in `outDimTags'. If `numElements' is not empty, also extrude the + !! mesh: the entries in `numElements' give the number of elements in each + !! layer. If `height' is not empty, it provides the (cumulative) height of the + !! different layers, normalized to 1. When the mesh is extruded the angle + !! should be strictly smaller than 2*Pi. If `recombine' is set, recombine the + !! mesh in the layers. + subroutine gmshModelOccRevolve(dimTags, dimTags_n, x, y, z, ax, ay, az, angle, outDimTags, outDimTags_n, numElements, numElements_n, heights, heights_n, recombine, ierr) bind(C, name="gmshModelOccRevolve") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + real(c_double), value :: ax + real(c_double), value :: ay + real(c_double), value :: az + real(c_double), value :: angle + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + integer(c_int) :: numElements(*) + integer(c_size_t), value :: numElements_n + real(c_double) :: heights(*) + integer(c_size_t), value :: heights_n + integer(c_int), value :: recombine + integer(c_int) :: ierr + end subroutine gmshModelOccRevolve + + !> Add a pipe in the OpenCASCADE CAD representation, by extruding the entities + !! `dimTags' along the wire `wireTag'. The type of sweep can be specified with + !! `trihedron' (possible values: "DiscreteTrihedron", "CorrectedFrenet", + !! "Fixed", "Frenet", "ConstantNormal", "Darboux", "GuideAC", "GuidePlan", + !! "GuideACWithContact", "GuidePlanWithContact"). If `trihedron' is not + !! provided, "DiscreteTrihedron" is assumed. Return the pipe in `outDimTags'. + subroutine gmshModelOccAddPipe(dimTags, dimTags_n, wireTag, outDimTags, outDimTags_n, trihedron, ierr) bind(C, name="gmshModelOccAddPipe") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int), value :: wireTag + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + character(len=1, kind=c_char) :: trihedron(*) + integer(c_int) :: ierr + end subroutine gmshModelOccAddPipe + + !> Fillet the volumes `volumeTags' on the curves `curveTags' with radii + !! `radii'. The `radii' vector can either contain a single radius, as many + !! radii as `curveTags', or twice as many as `curveTags' (in which case + !! different radii are provided for the begin and end points of the curves). + !! Return the filleted entities in `outDimTags'. Remove the original volume if + !! `removeVolume' is set. + subroutine gmshModelOccFillet(volumeTags, volumeTags_n, curveTags, curveTags_n, radii, radii_n, outDimTags, outDimTags_n, removeVolume, ierr) bind(C, name="gmshModelOccFillet") + use, intrinsic :: iso_c_binding + integer(c_int) :: volumeTags(*) + integer(c_size_t), value :: volumeTags_n + integer(c_int) :: curveTags(*) + integer(c_size_t), value :: curveTags_n + real(c_double) :: radii(*) + integer(c_size_t), value :: radii_n + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + integer(c_int), value :: removeVolume + integer(c_int) :: ierr + end subroutine gmshModelOccFillet + + !> Chamfer the volumes `volumeTags' on the curves `curveTags' with distances + !! `distances' measured on surfaces `surfaceTags'. The `distances' vector can + !! either contain a single distance, as many distances as `curveTags' and + !! `surfaceTags', or twice as many as `curveTags' and `surfaceTags' (in which + !! case the first in each pair is measured on the corresponding surface in + !! `surfaceTags', the other on the other adjacent surface). Return the + !! chamfered entities in `outDimTags'. Remove the original volume if + !! `removeVolume' is set. + subroutine gmshModelOccChamfer(volumeTags, volumeTags_n, curveTags, curveTags_n, surfaceTags, surfaceTags_n, distances, distances_n, outDimTags, outDimTags_n, removeVolume, ierr) bind(C, name="gmshModelOccChamfer") + use, intrinsic :: iso_c_binding + integer(c_int) :: volumeTags(*) + integer(c_size_t), value :: volumeTags_n + integer(c_int) :: curveTags(*) + integer(c_size_t), value :: curveTags_n + integer(c_int) :: surfaceTags(*) + integer(c_size_t), value :: surfaceTags_n + real(c_double) :: distances(*) + integer(c_size_t), value :: distances_n + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + integer(c_int), value :: removeVolume + integer(c_int) :: ierr + end subroutine gmshModelOccChamfer + + !> Compute the boolean union (the fusion) of the entities `objectDimTags' and + !! `toolDimTags' in the OpenCASCADE CAD representation. Return the resulting + !! entities in `outDimTags'. If `tag' is positive, try to set the tag + !! explicitly (only valid if the boolean operation results in a single + !! entity). Remove the object if `removeObject' is set. Remove the tool if + !! `removeTool' is set. + subroutine gmshModelOccFuse(objectDimTags, objectDimTags_n, toolDimTags, toolDimTags_n, outDimTags, outDimTags_n, outDimTagsMap, outDimTagsMap_n,outDimTagsMap_nn, tag, removeObject, removeTool, ierr) bind(C, name="gmshModelOccFuse") + use, intrinsic :: iso_c_binding + integer(c_int) :: objectDimTags(*) + integer(c_size_t), value :: objectDimTags_n + integer(c_int) :: toolDimTags(*) + integer(c_size_t), value :: toolDimTags_n + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + type(c_ptr), intent(out) :: outDimTagsMap + type(c_ptr), intent(out) :: outDimTagsMap_n + integer (C_SIZE_T) ::outDimTagsMap_nn + integer(c_int), value :: tag + integer(c_int), value :: removeObject + integer(c_int), value :: removeTool + integer(c_int) :: ierr + end subroutine gmshModelOccFuse + + !> Compute the boolean intersection (the common parts) of the entities + !! `objectDimTags' and `toolDimTags' in the OpenCASCADE CAD representation. + !! Return the resulting entities in `outDimTags'. If `tag' is positive, try to + !! set the tag explicitly (only valid if the boolean operation results in a + !! single entity). Remove the object if `removeObject' is set. Remove the tool + !! if `removeTool' is set. + subroutine gmshModelOccIntersect(objectDimTags, objectDimTags_n, toolDimTags, toolDimTags_n, outDimTags, outDimTags_n, outDimTagsMap, outDimTagsMap_n,outDimTagsMap_nn, tag, removeObject, removeTool, ierr) bind(C, name="gmshModelOccIntersect") + use, intrinsic :: iso_c_binding + integer(c_int) :: objectDimTags(*) + integer(c_size_t), value :: objectDimTags_n + integer(c_int) :: toolDimTags(*) + integer(c_size_t), value :: toolDimTags_n + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + type(c_ptr), intent(out) :: outDimTagsMap + type(c_ptr), intent(out) :: outDimTagsMap_n + integer (C_SIZE_T) ::outDimTagsMap_nn + integer(c_int), value :: tag + integer(c_int), value :: removeObject + integer(c_int), value :: removeTool + integer(c_int) :: ierr + end subroutine gmshModelOccIntersect + + !> Compute the boolean difference between the entities `objectDimTags' and + !! `toolDimTags' in the OpenCASCADE CAD representation. Return the resulting + !! entities in `outDimTags'. If `tag' is positive, try to set the tag + !! explicitly (only valid if the boolean operation results in a single + !! entity). Remove the object if `removeObject' is set. Remove the tool if + !! `removeTool' is set. + subroutine gmshModelOccCut(objectDimTags, objectDimTags_n, toolDimTags, toolDimTags_n, outDimTags, outDimTags_n, outDimTagsMap, outDimTagsMap_n,outDimTagsMap_nn, tag, removeObject, removeTool, ierr) bind(C, name="gmshModelOccCut") + use, intrinsic :: iso_c_binding + integer(c_int) :: objectDimTags(*) + integer(c_size_t), value :: objectDimTags_n + integer(c_int) :: toolDimTags(*) + integer(c_size_t), value :: toolDimTags_n + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + type(c_ptr), intent(out) :: outDimTagsMap + type(c_ptr), intent(out) :: outDimTagsMap_n + integer (C_SIZE_T) ::outDimTagsMap_nn + integer(c_int), value :: tag + integer(c_int), value :: removeObject + integer(c_int), value :: removeTool + integer(c_int) :: ierr + end subroutine gmshModelOccCut + + !> Compute the boolean fragments (general fuse) resulting from the + !! intersection of the entities `objectDimTags' and `toolDimTags' in the + !! OpenCASCADE CAD representation, making all iterfaces conformal. When + !! applied to entities of different dimensions, the lower dimensional entities + !! will be automatically embedded in the higher dimensional entities if they + !! are not on their boundary. Return the resulting entities in `outDimTags'. + !! If `tag' is positive, try to set the tag explicitly (only valid if the + !! boolean operation results in a single entity). Remove the object if + !! `removeObject' is set. Remove the tool if `removeTool' is set. + subroutine gmshModelOccFragment(objectDimTags, objectDimTags_n, toolDimTags, toolDimTags_n, outDimTags, outDimTags_n, outDimTagsMap, outDimTagsMap_n,outDimTagsMap_nn, tag, removeObject, removeTool, ierr) bind(C, name="gmshModelOccFragment") + use, intrinsic :: iso_c_binding + integer(c_int) :: objectDimTags(*) + integer(c_size_t), value :: objectDimTags_n + integer(c_int) :: toolDimTags(*) + integer(c_size_t), value :: toolDimTags_n + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + type(c_ptr), intent(out) :: outDimTagsMap + type(c_ptr), intent(out) :: outDimTagsMap_n + integer (C_SIZE_T) ::outDimTagsMap_nn + integer(c_int), value :: tag + integer(c_int), value :: removeObject + integer(c_int), value :: removeTool + integer(c_int) :: ierr + end subroutine gmshModelOccFragment + + !> Translate the entities `dimTags' in the OpenCASCADE CAD representation + !! along (`dx', `dy', `dz'). + subroutine gmshModelOccTranslate(dimTags, dimTags_n, dx, dy, dz, ierr) bind(C, name="gmshModelOccTranslate") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: dx + real(c_double), value :: dy + real(c_double), value :: dz + integer(c_int) :: ierr + end subroutine gmshModelOccTranslate + + !> Rotate the entities `dimTags' in the OpenCASCADE CAD representation by + !! `angle' radians around the axis of revolution defined by the point (`x', + !! `y', `z') and the direction (`ax', `ay', `az'). + subroutine gmshModelOccRotate(dimTags, dimTags_n, x, y, z, ax, ay, az, angle, ierr) bind(C, name="gmshModelOccRotate") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + real(c_double), value :: ax + real(c_double), value :: ay + real(c_double), value :: az + real(c_double), value :: angle + integer(c_int) :: ierr + end subroutine gmshModelOccRotate + + !> Scale the entities `dimTags' in the OpenCASCADE CAD representation by + !! factors `a', `b' and `c' along the three coordinate axes; use (`x', `y', + !! `z') as the center of the homothetic transformation. + subroutine gmshModelOccDilate(dimTags, dimTags_n, x, y, z, a, b, c, ierr) bind(C, name="gmshModelOccDilate") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + real(c_double), value :: a + real(c_double), value :: b + real(c_double), value :: c + integer(c_int) :: ierr + end subroutine gmshModelOccDilate + + !> Mirror the entities `dimTags' in the OpenCASCADE CAD representation, with + !! respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0. + subroutine gmshModelOccMirror(dimTags, dimTags_n, a, b, c, d, ierr) bind(C, name="gmshModelOccMirror") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: a + real(c_double), value :: b + real(c_double), value :: c + real(c_double), value :: d + integer(c_int) :: ierr + end subroutine gmshModelOccMirror + + !> Mirror the entities `dimTags' in the OpenCASCADE CAD representation, with + !! respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0. + !! (This is a deprecated synonym for `mirror'.) + subroutine gmshModelOccSymmetrize(dimTags, dimTags_n, a, b, c, d, ierr) bind(C, name="gmshModelOccSymmetrize") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: a + real(c_double), value :: b + real(c_double), value :: c + real(c_double), value :: d + integer(c_int) :: ierr + end subroutine gmshModelOccSymmetrize + + !> Apply a general affine transformation matrix `affineTransform' (16 entries + !! of a 4x4 matrix, by row; only the 12 first can be provided for convenience) + !! to the entities `dimTags' in the OpenCASCADE CAD representation. + subroutine gmshModelOccAffineTransform(dimTags, dimTags_n, affineTransform, affineTransform_n, ierr) bind(C, name="gmshModelOccAffineTransform") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double) :: affineTransform(*) + integer(c_size_t), value :: affineTransform_n + integer(c_int) :: ierr + end subroutine gmshModelOccAffineTransform + + !> Copy the entities `dimTags' in the OpenCASCADE CAD representation; the new + !! entities are returned in `outDimTags'. + subroutine gmshModelOccCopy(dimTags, dimTags_n, outDimTags, outDimTags_n, ierr) bind(C, name="gmshModelOccCopy") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + integer(c_int) :: ierr + end subroutine gmshModelOccCopy + + !> Remove the entities `dimTags' in the OpenCASCADE CAD representation, + !! provided that they are not on the boundary of higher-dimensional entities. + !! If `recursive' is true, remove all the entities on their boundaries, down + !! to dimension 0. + subroutine gmshModelOccRemove(dimTags, dimTags_n, recursive, ierr) bind(C, name="gmshModelOccRemove") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int), value :: recursive + integer(c_int) :: ierr + end subroutine gmshModelOccRemove + + !> Remove all duplicate entities in the OpenCASCADE CAD representation + !! (different entities at the same geometrical location) after intersecting + !! (using boolean fragments) all highest dimensional entities. + subroutine gmshModelOccRemoveAllDuplicates(ierr) bind(C, name="gmshModelOccRemoveAllDuplicates") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshModelOccRemoveAllDuplicates + + !> Apply various healing procedures to the entities `dimTags' (or to all the + !! entities in the model if `dimTags' is empty) in the OpenCASCADE CAD + !! representation. Return the healed entities in `outDimTags'. + subroutine gmshModelOccHealShapes(outDimTags, outDimTags_n, dimTags, dimTags_n, tolerance, fixDegenerated, fixSmallEdges, fixSmallFaces, sewFaces, makeSolids, ierr) bind(C, name="gmshModelOccHealShapes") + use, intrinsic :: iso_c_binding + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: tolerance + integer(c_int), value :: fixDegenerated + integer(c_int), value :: fixSmallEdges + integer(c_int), value :: fixSmallFaces + integer(c_int), value :: sewFaces + integer(c_int), value :: makeSolids + integer(c_int) :: ierr + end subroutine gmshModelOccHealShapes + + !> Convert the entities `dimTags' to NURBS. + subroutine gmshModelOccConvertToNURBS(dimTags, dimTags_n, ierr) bind(C, name="gmshModelOccConvertToNURBS") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + integer(c_int) :: ierr + end subroutine gmshModelOccConvertToNURBS + + !> Import BREP, STEP or IGES shapes from the file `fileName' in the + !! OpenCASCADE CAD representation. The imported entities are returned in + !! `outDimTags'. If the optional argument `highestDimOnly' is set, only import + !! the highest dimensional entities in the file. The optional argument + !! `format' can be used to force the format of the file (currently "brep", + !! "step" or "iges"). + subroutine gmshModelOccImportShapes(fileName, outDimTags, outDimTags_n, highestDimOnly, format, ierr) bind(C, name="gmshModelOccImportShapes") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: fileName(*) + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + integer(c_int), value :: highestDimOnly + character(len=1, kind=c_char) :: format(*) + integer(c_int) :: ierr + end subroutine gmshModelOccImportShapes + + !> Imports an OpenCASCADE `shape' by providing a pointer to a native + !! OpenCASCADE `TopoDS_Shape' object (passed as a pointer to void). The + !! imported entities are returned in `outDimTags'. If the optional argument + !! `highestDimOnly' is set, only import the highest dimensional entities in + !! `shape'. In Python, this function can be used for integration with + !! PythonOCC, in which the SwigPyObject pointer of `TopoDS_Shape' must be + !! passed as an int to `shape', i.e., `shape = int(pythonocc_shape.this)'. + !! Warning: this function is unsafe, as providing an invalid pointer will lead + !! to undefined behavior. + subroutine gmshModelOccImportShapesNativePointer(shape, outDimTags, outDimTags_n, highestDimOnly, ierr) bind(C, name="gmshModelOccImportShapesNativePointer") + use, intrinsic :: iso_c_binding + integer(c_int) :: shape(*) + type(c_ptr), intent(out) :: outDimTags + integer(c_size_t) :: outDimTags_n + integer(c_int), value :: highestDimOnly + integer(c_int) :: ierr + end subroutine gmshModelOccImportShapesNativePointer + + !> Get all the OpenCASCADE entities. If `dim' is >= 0, return only the + !! entities of the specified dimension (e.g. points if `dim' == 0). The + !! entities are returned as a vector of (dim, tag) integer pairs. + subroutine gmshModelOccGetEntities(dimTags, dimTags_n, dim, ierr) bind(C, name="gmshModelOccGetEntities") + use, intrinsic :: iso_c_binding + type(c_ptr), intent(out) :: dimTags + integer(c_size_t) :: dimTags_n + integer(c_int), value :: dim + integer(c_int) :: ierr + end subroutine gmshModelOccGetEntities + + !> Get the OpenCASCADE entities in the bounding box defined by the two points + !! (`xmin', `ymin', `zmin') and (`xmax', `ymax', `zmax'). If `dim' is >= 0, + !! return only the entities of the specified dimension (e.g. points if `dim' + !! == 0). + subroutine gmshModelOccGetEntitiesInBoundingBox(xmin, ymin, zmin, xmax, ymax, zmax, tags, tags_n, dim, ierr) bind(C, name="gmshModelOccGetEntitiesInBoundingBox") + use, intrinsic :: iso_c_binding + real(c_double), value :: xmin + real(c_double), value :: ymin + real(c_double), value :: zmin + real(c_double), value :: xmax + real(c_double), value :: ymax + real(c_double), value :: zmax + type(c_ptr), intent(out) :: tags + integer(c_size_t) :: tags_n + integer(c_int), value :: dim + integer(c_int) :: ierr + end subroutine gmshModelOccGetEntitiesInBoundingBox + + !> Get the bounding box (`xmin', `ymin', `zmin'), (`xmax', `ymax', `zmax') of + !! the OpenCASCADE entity of dimension `dim' and tag `tag'. + subroutine gmshModelOccGetBoundingBox(dim, tag, xmin, ymin, zmin, xmax, ymax, zmax, ierr) bind(C, name="gmshModelOccGetBoundingBox") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + real(c_double) :: xmin + real(c_double) :: ymin + real(c_double) :: zmin + real(c_double) :: xmax + real(c_double) :: ymax + real(c_double) :: zmax + integer(c_int) :: ierr + end subroutine gmshModelOccGetBoundingBox + + !> Get the tags `curveLoopTags' of the curve loops making up the surface of + !! tag `surfaceTag', as well as the tags `curveTags' of the curves making up + !! each curve loop. + subroutine gmshModelOccGetCurveLoops(surfaceTag, curveLoopTags, curveLoopTags_n, curveTags, curveTags_n,curveTags_nn, ierr) bind(C, name="gmshModelOccGetCurveLoops") + use, intrinsic :: iso_c_binding + integer(c_int), value :: surfaceTag + type(c_ptr), intent(out) :: curveLoopTags + integer(c_size_t) :: curveLoopTags_n + type(c_ptr), intent(out) :: curveTags + type(c_ptr), intent(out) :: curveTags_n + integer(c_size_t) :: curveTags_nn + integer(c_int) :: ierr + end subroutine gmshModelOccGetCurveLoops + + !> Get the tags `surfaceLoopTags' of the surface loops making up the volume of + !! tag `volumeTag', as well as the tags `surfaceTags' of the surfaces making + !! up each surface loop. + subroutine gmshModelOccGetSurfaceLoops(volumeTag, surfaceLoopTags, surfaceLoopTags_n, surfaceTags, surfaceTags_n,surfaceTags_nn, ierr) bind(C, name="gmshModelOccGetSurfaceLoops") + use, intrinsic :: iso_c_binding + integer(c_int), value :: volumeTag + type(c_ptr), intent(out) :: surfaceLoopTags + integer(c_size_t) :: surfaceLoopTags_n + type(c_ptr), intent(out) :: surfaceTags + type(c_ptr), intent(out) :: surfaceTags_n + integer(c_size_t) :: surfaceTags_nn + integer(c_int) :: ierr + end subroutine gmshModelOccGetSurfaceLoops + + !> Get the mass of the OpenCASCADE entity of dimension `dim' and tag `tag'. + subroutine gmshModelOccGetMass(dim, tag, mass, ierr) bind(C, name="gmshModelOccGetMass") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + real(c_double) :: mass + integer(c_int) :: ierr + end subroutine gmshModelOccGetMass + + !> Get the center of mass of the OpenCASCADE entity of dimension `dim' and tag + !! `tag'. + subroutine gmshModelOccGetCenterOfMass(dim, tag, x, y, z, ierr) bind(C, name="gmshModelOccGetCenterOfMass") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + real(c_double) :: x + real(c_double) :: y + real(c_double) :: z + integer(c_int) :: ierr + end subroutine gmshModelOccGetCenterOfMass + + !> Get the matrix of inertia (by row) of the OpenCASCADE entity of dimension + !! `dim' and tag `tag'. + subroutine gmshModelOccGetMatrixOfInertia(dim, tag, mat, mat_n, ierr) bind(C, name="gmshModelOccGetMatrixOfInertia") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + type(c_ptr), intent(out) :: mat + integer(c_size_t) :: mat_n + integer(c_int) :: ierr + end subroutine gmshModelOccGetMatrixOfInertia + + !> Get the maximum tag of entities of dimension `dim' in the OpenCASCADE CAD + !! representation. + function gmshModelOccGetMaxTag(dim, ierr) bind(C, name="gmshModelOccGetMaxTag") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshModelOccGetMaxTag + integer(c_int), value :: dim + integer(c_int) :: ierr + end function gmshModelOccGetMaxTag + + !> Set the maximum tag `maxTag' for entities of dimension `dim' in the + !! OpenCASCADE CAD representation. + subroutine gmshModelOccSetMaxTag(dim, maxTag, ierr) bind(C, name="gmshModelOccSetMaxTag") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: maxTag + integer(c_int) :: ierr + end subroutine gmshModelOccSetMaxTag + + !> Synchronize the OpenCASCADE CAD representation with the current Gmsh model. + !! This can be called at any time, but since it involves a non trivial amount + !! of processing, the number of synchronization points should normally be + !! minimized. Without synchronization the entities in the OpenCASCADE CAD + !! representation are not available to any function outside of the OpenCASCADE + !! CAD kernel functions. + subroutine gmshModelOccSynchronize(ierr) bind(C, name="gmshModelOccSynchronize") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshModelOccSynchronize + + !> Set a mesh size constraint on the entities `dimTags' in the OpenCASCADE CAD + !! representation. Currently only entities of dimension 0 (points) are + !! handled. + subroutine gmshModelOccMeshSetSize(dimTags, dimTags_n, size, ierr) bind(C, name="gmshModelOccMeshSetSize") + use, intrinsic :: iso_c_binding + integer(c_int) :: dimTags(*) + integer(c_size_t), value :: dimTags_n + real(c_double), value :: size + integer(c_int) :: ierr + end subroutine gmshModelOccMeshSetSize + + !> Add a new post-processing view, with name `name'. If `tag' is positive use + !! it (and remove the view with that tag if it already exists), otherwise + !! associate a new tag. Return the view tag. + function gmshViewAdd(name, tag, ierr) bind(C, name="gmshViewAdd") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshViewAdd + character(len=1, kind=c_char) :: name(*) + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshViewAdd + + !> Remove the view with tag `tag'. + subroutine gmshViewRemove(tag, ierr) bind(C, name="gmshViewRemove") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + integer(c_int) :: ierr + end subroutine gmshViewRemove + + !> Get the index of the view with tag `tag' in the list of currently loaded + !! views. This dynamic index (it can change when views are removed) is used to + !! access view options. + function gmshViewGetIndex(tag, ierr) bind(C, name="gmshViewGetIndex") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshViewGetIndex + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshViewGetIndex + + !> Get the tags of all views. + subroutine gmshViewGetTags(tags, tags_n, ierr) bind(C, name="gmshViewGetTags") + use, intrinsic :: iso_c_binding + type(c_ptr), intent(out) :: tags + integer(c_size_t) :: tags_n + integer(c_int) :: ierr + end subroutine gmshViewGetTags + + !> Add model-based post-processing data to the view with tag `tag'. + !! `modelName' identifies the model the data is attached to. `dataType' + !! specifies the type of data, currently either "NodeData", "ElementData" or + !! "ElementNodeData". `step' specifies the identifier (>= 0) of the data in a + !! sequence. `tags' gives the tags of the nodes or elements in the mesh to + !! which the data is associated. `data' is a vector of the same length as + !! `tags': each entry is the vector of double precision numbers representing + !! the data associated with the corresponding tag. The optional `time' + !! argument associate a time value with the data. `numComponents' gives the + !! number of data components (1 for scalar data, 3 for vector data, etc.) per + !! entity; if negative, it is automatically inferred (when possible) from the + !! input data. `partition' allows one to specify data in several sub-sets. + subroutine gmshViewAddModelData(tag, step, modelName, dataType, tags, tags_n, data, data_n,data_nn, time, numComponents, partition, ierr) bind(C, name="gmshViewAddModelData") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + integer(c_int), value :: step + character(len=1, kind=c_char) :: modelName(*) + character(len=1, kind=c_char) :: dataType(*) + integer(c_size_t) :: tags(*) + integer(c_size_t), value :: tags_n + type(c_ptr), intent(out) :: data + type(c_ptr), intent(out) :: data_n + integer(c_size_t) :: data_nn + real(c_double), value :: time + integer(c_int), value :: numComponents + integer(c_int), value :: partition + integer(c_int) :: ierr + end subroutine gmshViewAddModelData + + !> Add homogeneous model-based post-processing data to the view with tag + !! `tag'. The arguments have the same meaning as in `addModelData', except + !! that `data' is supposed to be homogeneous and is thus flattened in a single + !! vector. For data types that can lead to different data sizes per tag (like + !! "ElementNodeData"), the data should be padded. + subroutine gmshViewAddHomogeneousModelData(tag, step, modelName, dataType, tags, tags_n, data, data_n, time, numComponents, partition, ierr) bind(C, name="gmshViewAddHomogeneousModelData") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + integer(c_int), value :: step + character(len=1, kind=c_char) :: modelName(*) + character(len=1, kind=c_char) :: dataType(*) + integer(c_size_t) :: tags(*) + integer(c_size_t), value :: tags_n + real(c_double) :: data(*) + integer(c_size_t), value :: data_n + real(c_double), value :: time + integer(c_int), value :: numComponents + integer(c_int), value :: partition + integer(c_int) :: ierr + end subroutine gmshViewAddHomogeneousModelData + + !> Get model-based post-processing data from the view with tag `tag' at step + !! `step'. Return the `data' associated to the nodes or the elements with tags + !! `tags', as well as the `dataType' and the number of components + !! `numComponents'. + subroutine gmshViewGetModelData(tag, step, dataType, tags, tags_n, data, data_n,data_nn, time, numComponents, ierr) bind(C, name="gmshViewGetModelData") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + integer(c_int), value :: step + type(c_ptr) :: dataType(*) + type(c_ptr), intent(out) :: tags + integer(c_size_t) :: tags_n + type (c_ptr), intent(out) :: data + type(c_ptr), intent(out) :: data_n + integer (c_size_t) :: data_nn + real(c_double) :: time + integer(c_int) :: numComponents + integer(c_int) :: ierr + end subroutine gmshViewGetModelData + + !> Get homogeneous model-based post-processing data from the view with tag + !! `tag' at step `step'. The arguments have the same meaning as in + !! `getModelData', except that `data' is returned flattened in a single + !! vector, with the appropriate padding if necessary. + subroutine gmshViewGetHomogeneousModelData(tag, step, dataType, tags, tags_n, data, data_n, time, numComponents, ierr) bind(C, name="gmshViewGetHomogeneousModelData") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + integer(c_int), value :: step + type(c_ptr) :: dataType(*) + type(c_ptr), intent(out) :: tags + integer(c_size_t) :: tags_n + type(c_ptr), intent(out) :: data + integer(c_size_t) :: data_n + real(c_double) :: time + integer(c_int) :: numComponents + integer(c_int) :: ierr + end subroutine gmshViewGetHomogeneousModelData + + !> Add list-based post-processing data to the view with tag `tag'. List-based + !! datasets are independent from any model and any mesh. `dataType' identifies + !! the data by concatenating the field type ("S" for scalar, "V" for vector, + !! "T" for tensor) and the element type ("P" for point, "L" for line, "T" for + !! triangle, "S" for tetrahedron, "I" for prism, "H" for hexaHedron, "Y" for + !! pyramid). For example `dataType' should be "ST" for a scalar field on + !! triangles. `numEle' gives the number of elements in the data. `data' + !! contains the data for the `numEle' elements, concatenated, with node + !! coordinates followed by values per node, repeated for each step: [e1x1, + !! ..., e1xn, e1y1, ..., e1yn, e1z1, ..., e1zn, e1v1..., e1vN, e2x1, ...]. + subroutine gmshViewAddListData(tag, dataType, numEle, data, data_n, ierr) bind(C, name="gmshViewAddListData") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + character(len=1, kind=c_char) :: dataType(*) + integer(c_int), value :: numEle + real(c_double) :: data(*) + integer(c_size_t), value :: data_n + integer(c_int) :: ierr + end subroutine gmshViewAddListData + + !> Get list-based post-processing data from the view with tag `tag'. Return + !! the types `dataTypes', the number of elements `numElements' for each data + !! type and the `data' for each data type. + subroutine gmshViewGetListData(tag, dataType, dataType_n, numElements, numElements_n, data, data_n,data_nn, ierr) bind(C, name="gmshViewGetListData") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + type(c_ptr), intent(out) :: dataType + integer(c_size_t) :: dataType_n + type(c_ptr), intent(out) :: numElements + integer(c_size_t) :: numElements_n + type (c_ptr), intent(out) :: data + type(c_ptr), intent(out) :: data_n + integer (c_size_t) :: data_nn + integer(c_int) :: ierr + end subroutine gmshViewGetListData + + !> Add a string to a list-based post-processing view with tag `tag'. If + !! `coord' contains 3 coordinates the string is positioned in the 3D model + !! space ("3D string"); if it contains 2 coordinates it is positioned in the + !! 2D graphics viewport ("2D string"). `data' contains one or more (for + !! multistep views) strings. `style' contains key-value pairs of styling + !! parameters, concatenated. Available keys are "Font" (possible values: + !! "Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic", + !! "Helvetica", "Helvetica-Bold", "Helvetica-Oblique", "Helvetica- + !! BoldOblique", "Courier", "Courier-Bold", "Courier-Oblique", "Courier- + !! BoldOblique", "Symbol", "ZapfDingbats", "Screen"), "FontSize" and "Align" + !! (possible values: "Left" or "BottomLeft", "Center" or "BottomCenter", + !! "Right" or "BottomRight", "TopLeft", "TopCenter", "TopRight", "CenterLeft", + !! "CenterCenter", "CenterRight"). + subroutine gmshViewAddListDataString(tag, coord, coord_n, data, data_n, style, style_n, ierr) bind(C, name="gmshViewAddListDataString") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + real(c_double) :: coord(*) + integer(c_size_t), value :: coord_n + type(c_ptr) :: data(*) + integer(c_size_t), value :: data_n + type(c_ptr) :: style(*) + integer(c_size_t), value :: style_n + integer(c_int) :: ierr + end subroutine gmshViewAddListDataString + + !> Get list-based post-processing data strings (2D strings if `dim' = 2, 3D + !! strings if `dim' = 3) from the view with tag `tag'. Return the coordinates + !! in `coord', the strings in `data' and the styles in `style'. + subroutine gmshViewGetListDataStrings(tag, dim, coord, coord_n, data, data_n, style, style_n, ierr) bind(C, name="gmshViewGetListDataStrings") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + integer(c_int), value :: dim + type(c_ptr), intent(out) :: coord + integer(c_size_t) :: coord_n + type(c_ptr), intent(out) :: data + integer(c_size_t) :: data_n + type(c_ptr), intent(out) :: style + integer(c_size_t) :: style_n + integer(c_int) :: ierr + end subroutine gmshViewGetListDataStrings + + !> Set interpolation matrices for the element family `type' ("Line", + !! "Triangle", "Quadrangle", "Tetrahedron", "Hexahedron", "Prism", "Pyramid") + !! in the view `tag'. The approximation of the values over an element is + !! written as a linear combination of `d' basis functions f_i(u, v, w) = + !! sum_(j = 0, ..., `d' - 1) `coef'[i][j] u^`exp'[j][0] v^`exp'[j][1] + !! w^`exp'[j][2], i = 0, ..., `d'-1, with u, v, w the coordinates in the + !! reference element. The `coef' matrix (of size `d' x `d') and the `exp' + !! matrix (of size `d' x 3) are stored as vectors, by row. If `dGeo' is + !! positive, use `coefGeo' and `expGeo' to define the interpolation of the x, + !! y, z coordinates of the element in terms of the u, v, w coordinates, in + !! exactly the same way. If `d' < 0, remove the interpolation matrices. + subroutine gmshViewSetInterpolationMatrices(tag, type, d, coef, coef_n, exp, exp_n, dGeo, coefGeo, coefGeo_n, expGeo, expGeo_n, ierr) bind(C, name="gmshViewSetInterpolationMatrices") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + character(len=1, kind=c_char) :: type(*) + integer(c_int), value :: d + real(c_double) :: coef(*) + integer(c_size_t), value :: coef_n + real(c_double) :: exp(*) + integer(c_size_t), value :: exp_n + integer(c_int), value :: dGeo + real(c_double) :: coefGeo(*) + integer(c_size_t), value :: coefGeo_n + real(c_double) :: expGeo(*) + integer(c_size_t), value :: expGeo_n + integer(c_int) :: ierr + end subroutine gmshViewSetInterpolationMatrices + + !> Add a post-processing view as an `alias' of the reference view with tag + !! `refTag'. If `copyOptions' is set, copy the options of the reference view. + !! If `tag' is positive use it (and remove the view with that tag if it + !! already exists), otherwise associate a new tag. Return the view tag. + function gmshViewAddAlias(refTag, copyOptions, tag, ierr) bind(C, name="gmshViewAddAlias") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshViewAddAlias + integer(c_int), value :: refTag + integer(c_int), value :: copyOptions + integer(c_int), value :: tag + integer(c_int) :: ierr + end function gmshViewAddAlias + + !> Combine elements (if `what' == "elements") or steps (if `what' == "steps") + !! of all views (`how' == "all"), all visible views (`how' == "visible") or + !! all views having the same name (`how' == "name"). Remove original views if + !! `remove' is set. + subroutine gmshViewCombine(what, how, remove, copyOptions, ierr) bind(C, name="gmshViewCombine") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: what(*) + character(len=1, kind=c_char) :: how(*) + integer(c_int), value :: remove + integer(c_int), value :: copyOptions + integer(c_int) :: ierr + end subroutine gmshViewCombine + + !> Probe the view `tag' for its `value' at point (`x', `y', `z'). If no match + !! is found, `value' is returned empty. Return only the value at step `step' + !! is `step' is positive. Return only values with `numComp' if `numComp' is + !! positive. Return the gradient of the `value' if `gradient' is set. If + !! `distanceMax' is zero, only return a result if an exact match inside an + !! element in the view is found; if `distanceMax' is positive and an exact + !! match is not found, return the value at the closest node if it is closer + !! than `distanceMax'; if `distanceMax' is negative and an exact match is not + !! found, always return the value at the closest node. The distance to the + !! match is returned in `distance'. Return the result from the element + !! described by its coordinates if `xElementCoord', `yElementCoord' and + !! `zElementCoord' are provided. If `dim' is >= 0, return only matches from + !! elements of the specified dimension. + subroutine gmshViewProbe(tag, x, y, z, value, value_n, distance, step, numComp, gradient, distanceMax, xElemCoord, xElemCoord_n, yElemCoord, yElemCoord_n, zElemCoord, zElemCoord_n, dim, ierr) bind(C, name="gmshViewProbe") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + real(c_double), value :: x + real(c_double), value :: y + real(c_double), value :: z + type(c_ptr), intent(out) :: value + integer(c_size_t) :: value_n + real(c_double) :: distance + integer(c_int), value :: step + integer(c_int), value :: numComp + integer(c_int), value :: gradient + real(c_double), value :: distanceMax + real(c_double) :: xElemCoord(*) + integer(c_size_t), value :: xElemCoord_n + real(c_double) :: yElemCoord(*) + integer(c_size_t), value :: yElemCoord_n + real(c_double) :: zElemCoord(*) + integer(c_size_t), value :: zElemCoord_n + integer(c_int), value :: dim + integer(c_int) :: ierr + end subroutine gmshViewProbe + + !> Write the view to a file `fileName'. The export format is determined by the + !! file extension. Append to the file if `append' is set. + subroutine gmshViewWrite(tag, fileName, append, ierr) bind(C, name="gmshViewWrite") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + character(len=1, kind=c_char) :: fileName(*) + integer(c_int), value :: append + integer(c_int) :: ierr + end subroutine gmshViewWrite + + !> Set the global visibility of the view `tag' per window to `value', where + !! `windowIndex' identifies the window in the window list. + subroutine gmshViewSetVisibilityPerWindow(tag, value, windowIndex, ierr) bind(C, name="gmshViewSetVisibilityPerWindow") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + integer(c_int), value :: value + integer(c_int), value :: windowIndex + integer(c_int) :: ierr + end subroutine gmshViewSetVisibilityPerWindow + + !> Set the numerical option `name' to value `value' for the view with tag + !! `tag'. + subroutine gmshViewOptionSetNumber(tag, name, value, ierr) bind(C, name="gmshViewOptionSetNumber") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + character(len=1, kind=c_char) :: name(*) + real(c_double), value :: value + integer(c_int) :: ierr + end subroutine gmshViewOptionSetNumber + + !> Get the `value' of the numerical option `name' for the view with tag `tag'. + subroutine gmshViewOptionGetNumber(tag, name, value, ierr) bind(C, name="gmshViewOptionGetNumber") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + character(len=1, kind=c_char) :: name(*) + real(c_double) :: value + integer(c_int) :: ierr + end subroutine gmshViewOptionGetNumber + + !> Set the string option `name' to value `value' for the view with tag `tag'. + subroutine gmshViewOptionSetString(tag, name, value, ierr) bind(C, name="gmshViewOptionSetString") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + character(len=1, kind=c_char) :: name(*) + character(len=1, kind=c_char) :: value(*) + integer(c_int) :: ierr + end subroutine gmshViewOptionSetString + + !> Get the `value' of the string option `name' for the view with tag `tag'. + subroutine gmshViewOptionGetString(tag, name, value, ierr) bind(C, name="gmshViewOptionGetString") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + character(len=1, kind=c_char) :: name(*) + type(c_ptr) :: value(*) + integer(c_int) :: ierr + end subroutine gmshViewOptionGetString + + !> Set the color option `name' to the RGBA value (`r', `g', `b', `a') for the + !! view with tag `tag', where where `r', `g', `b' and `a' should be integers + !! between 0 and 255. + subroutine gmshViewOptionSetColor(tag, name, r, g, b, a, ierr) bind(C, name="gmshViewOptionSetColor") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + character(len=1, kind=c_char) :: name(*) + integer(c_int), value :: r + integer(c_int), value :: g + integer(c_int), value :: b + integer(c_int), value :: a + integer(c_int) :: ierr + end subroutine gmshViewOptionSetColor + + !> Get the `r', `g', `b', `a' value of the color option `name' for the view + !! with tag `tag'. + subroutine gmshViewOptionGetColor(tag, name, r, g, b, a, ierr) bind(C, name="gmshViewOptionGetColor") + use, intrinsic :: iso_c_binding + integer(c_int), value :: tag + character(len=1, kind=c_char) :: name(*) + integer(c_int) :: r + integer(c_int) :: g + integer(c_int) :: b + integer(c_int) :: a + integer(c_int) :: ierr + end subroutine gmshViewOptionGetColor + + !> Copy the options from the view with tag `refTag' to the view with tag + !! `tag'. + subroutine gmshViewOptionCopy(refTag, tag, ierr) bind(C, name="gmshViewOptionCopy") + use, intrinsic :: iso_c_binding + integer(c_int), value :: refTag + integer(c_int), value :: tag + integer(c_int) :: ierr + end subroutine gmshViewOptionCopy + + !> Set the numerical option `option' to the value `value' for plugin `name'. + subroutine gmshPluginSetNumber(name, option, value, ierr) bind(C, name="gmshPluginSetNumber") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + character(len=1, kind=c_char) :: option(*) + real(c_double), value :: value + integer(c_int) :: ierr + end subroutine gmshPluginSetNumber + + !> Set the string option `option' to the value `value' for plugin `name'. + subroutine gmshPluginSetString(name, option, value, ierr) bind(C, name="gmshPluginSetString") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + character(len=1, kind=c_char) :: option(*) + character(len=1, kind=c_char) :: value(*) + integer(c_int) :: ierr + end subroutine gmshPluginSetString + + !> Run the plugin `name'. Return the tag of the created view (if any). + function gmshPluginRun(name, ierr) bind(C, name="gmshPluginRun") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshPluginRun + character(len=1, kind=c_char) :: name(*) + integer(c_int) :: ierr + end function gmshPluginRun + + !> Draw all the OpenGL scenes. + subroutine gmshGraphicsDraw(ierr) bind(C, name="gmshGraphicsDraw") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshGraphicsDraw + + !> Create the FLTK graphical user interface. Can only be called in the main + !! thread. + subroutine gmshFltkInitialize(ierr) bind(C, name="gmshFltkInitialize") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshFltkInitialize + + !> Close the FLTK graphical user interface. Can only be called in the main + !! thread. + subroutine gmshFltkFinalize(ierr) bind(C, name="gmshFltkFinalize") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshFltkFinalize + + !> Wait at most `time' seconds for user interface events and return. If `time' + !! < 0, wait indefinitely. First automatically create the user interface if it + !! has not yet been initialized. Can only be called in the main thread. + subroutine gmshFltkWait(time, ierr) bind(C, name="gmshFltkWait") + use, intrinsic :: iso_c_binding + real(c_double), value :: time + integer(c_int) :: ierr + end subroutine gmshFltkWait + + !> Update the user interface (potentially creating new widgets and windows). + !! First automatically create the user interface if it has not yet been + !! initialized. Can only be called in the main thread: use `awake("update")' + !! to trigger an update of the user interface from another thread. + subroutine gmshFltkUpdate(ierr) bind(C, name="gmshFltkUpdate") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshFltkUpdate + + !> Awake the main user interface thread and process pending events, and + !! optionally perform an action (currently the only `action' allowed is + !! "update"). + subroutine gmshFltkAwake(action, ierr) bind(C, name="gmshFltkAwake") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: action(*) + integer(c_int) :: ierr + end subroutine gmshFltkAwake + + !> Block the current thread until it can safely modify the user interface. + subroutine gmshFltkLock(ierr) bind(C, name="gmshFltkLock") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshFltkLock + + !> Release the lock that was set using lock. + subroutine gmshFltkUnlock(ierr) bind(C, name="gmshFltkUnlock") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshFltkUnlock + + !> Run the event loop of the graphical user interface, i.e. repeatedly call + !! `wait()'. First automatically create the user interface if it has not yet + !! been initialized. Can only be called in the main thread. + subroutine gmshFltkRun(ierr) bind(C, name="gmshFltkRun") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshFltkRun + + !> Check if the user interface is available (e.g. to detect if it has been + !! closed). + function gmshFltkIsAvailable(ierr) bind(C, name="gmshFltkIsAvailable") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshFltkIsAvailable + integer(c_int) :: ierr + end function gmshFltkIsAvailable + + !> Select entities in the user interface. If `dim' is >= 0, return only the + !! entities of the specified dimension (e.g. points if `dim' == 0). + function gmshFltkSelectEntities(dimTags, dimTags_n, dim, ierr) bind(C, name="gmshFltkSelectEntities") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshFltkSelectEntities + type(c_ptr), intent(out) :: dimTags + integer(c_size_t) :: dimTags_n + integer(c_int), value :: dim + integer(c_int) :: ierr + end function gmshFltkSelectEntities + + !> Select elements in the user interface. + function gmshFltkSelectElements(elementTags, elementTags_n, ierr) bind(C, name="gmshFltkSelectElements") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshFltkSelectElements + type(c_ptr), intent(out) :: elementTags + integer(c_size_t) :: elementTags_n + integer(c_int) :: ierr + end function gmshFltkSelectElements + + !> Select views in the user interface. + function gmshFltkSelectViews(viewTags, viewTags_n, ierr) bind(C, name="gmshFltkSelectViews") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshFltkSelectViews + type(c_ptr), intent(out) :: viewTags + integer(c_size_t) :: viewTags_n + integer(c_int) :: ierr + end function gmshFltkSelectViews + + !> Split the current window horizontally (if `how' = "h") or vertically (if + !! `how' = "v"), using ratio `ratio'. If `how' = "u", restore a single window. + subroutine gmshFltkSplitCurrentWindow(how, ratio, ierr) bind(C, name="gmshFltkSplitCurrentWindow") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: how(*) + real(c_double), value :: ratio + integer(c_int) :: ierr + end subroutine gmshFltkSplitCurrentWindow + + !> Set the current window by speficying its index (starting at 0) in the list + !! of all windows. When new windows are created by splits, new windows are + !! appended at the end of the list. + subroutine gmshFltkSetCurrentWindow(windowIndex, ierr) bind(C, name="gmshFltkSetCurrentWindow") + use, intrinsic :: iso_c_binding + integer(c_int), value :: windowIndex + integer(c_int) :: ierr + end subroutine gmshFltkSetCurrentWindow + + !> Set a status message in the current window. If `graphics' is set, display + !! the message inside the graphic window instead of the status bar. + subroutine gmshFltkSetStatusMessage(message, graphics, ierr) bind(C, name="gmshFltkSetStatusMessage") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: message(*) + integer(c_int), value :: graphics + integer(c_int) :: ierr + end subroutine gmshFltkSetStatusMessage + + !> Show context window for the entity of dimension `dim' and tag `tag'. + subroutine gmshFltkShowContextWindow(dim, tag, ierr) bind(C, name="gmshFltkShowContextWindow") + use, intrinsic :: iso_c_binding + integer(c_int), value :: dim + integer(c_int), value :: tag + integer(c_int) :: ierr + end subroutine gmshFltkShowContextWindow + + !> Open the `name' item in the menu tree. + subroutine gmshFltkOpenTreeItem(name, ierr) bind(C, name="gmshFltkOpenTreeItem") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + integer(c_int) :: ierr + end subroutine gmshFltkOpenTreeItem + + !> Close the `name' item in the menu tree. + subroutine gmshFltkCloseTreeItem(name, ierr) bind(C, name="gmshFltkCloseTreeItem") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + integer(c_int) :: ierr + end subroutine gmshFltkCloseTreeItem + + !> Get the names of the variables in the Gmsh parser matching the `search' + !! regular expression. If `search' is empty, return all the names. + subroutine gmshParserGetNames(names, names_n, search, ierr) bind(C, name="gmshParserGetNames") + use, intrinsic :: iso_c_binding + type(c_ptr), intent(out) :: names + integer(c_size_t) :: names_n + character(len=1, kind=c_char) :: search(*) + integer(c_int) :: ierr + end subroutine gmshParserGetNames + + !> Set the value of the number variable `name' in the Gmsh parser. Create the + !! variable if it does not exist; update the value if the variable exists. + subroutine gmshParserSetNumber(name, value, value_n, ierr) bind(C, name="gmshParserSetNumber") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + real(c_double) :: value(*) + integer(c_size_t), value :: value_n + integer(c_int) :: ierr + end subroutine gmshParserSetNumber + + !> Set the value of the string variable `name' in the Gmsh parser. Create the + !! variable if it does not exist; update the value if the variable exists. + subroutine gmshParserSetString(name, value, value_n, ierr) bind(C, name="gmshParserSetString") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + type(c_ptr) :: value(*) + integer(c_size_t), value :: value_n + integer(c_int) :: ierr + end subroutine gmshParserSetString + + !> Get the value of the number variable `name' from the Gmsh parser. Return an + !! empty vector if the variable does not exist. + subroutine gmshParserGetNumber(name, value, value_n, ierr) bind(C, name="gmshParserGetNumber") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + type(c_ptr), intent(out) :: value + integer(c_size_t) :: value_n + integer(c_int) :: ierr + end subroutine gmshParserGetNumber + + !> Get the value of the string variable `name' from the Gmsh parser. Return an + !! empty vector if the variable does not exist. + subroutine gmshParserGetString(name, value, value_n, ierr) bind(C, name="gmshParserGetString") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + type(c_ptr), intent(out) :: value + integer(c_size_t) :: value_n + integer(c_int) :: ierr + end subroutine gmshParserGetString + + !> Clear all the Gmsh parser variables, or remove a single variable if `name' + !! is given. + subroutine gmshParserClear(name, ierr) bind(C, name="gmshParserClear") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + integer(c_int) :: ierr + end subroutine gmshParserClear + + !> Parse the file `fileName' with the Gmsh parser. + subroutine gmshParserParse(fileName, ierr) bind(C, name="gmshParserParse") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: fileName(*) + integer(c_int) :: ierr + end subroutine gmshParserParse + + !> Set one or more parameters in the ONELAB database, encoded in `format'. + subroutine gmshOnelabSet(data, format, ierr) bind(C, name="gmshOnelabSet") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: data(*) + character(len=1, kind=c_char) :: format(*) + integer(c_int) :: ierr + end subroutine gmshOnelabSet + + !> Get all the parameters (or a single one if `name' is specified) from the + !! ONELAB database, encoded in `format'. + subroutine gmshOnelabGet(data, name, format, ierr) bind(C, name="gmshOnelabGet") + use, intrinsic :: iso_c_binding + type(c_ptr) :: data(*) + character(len=1, kind=c_char) :: name(*) + character(len=1, kind=c_char) :: format(*) + integer(c_int) :: ierr + end subroutine gmshOnelabGet + + !> Get the names of the parameters in the ONELAB database matching the + !! `search' regular expression. If `search' is empty, return all the names. + subroutine gmshOnelabGetNames(names, names_n, search, ierr) bind(C, name="gmshOnelabGetNames") + use, intrinsic :: iso_c_binding + type(c_ptr), intent(out) :: names + integer(c_size_t) :: names_n + character(len=1, kind=c_char) :: search(*) + integer(c_int) :: ierr + end subroutine gmshOnelabGetNames + + !> Set the value of the number parameter `name' in the ONELAB database. Create + !! the parameter if it does not exist; update the value if the parameter + !! exists. + subroutine gmshOnelabSetNumber(name, value, value_n, ierr) bind(C, name="gmshOnelabSetNumber") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + real(c_double) :: value(*) + integer(c_size_t), value :: value_n + integer(c_int) :: ierr + end subroutine gmshOnelabSetNumber + + !> Set the value of the string parameter `name' in the ONELAB database. Create + !! the parameter if it does not exist; update the value if the parameter + !! exists. + subroutine gmshOnelabSetString(name, value, value_n, ierr) bind(C, name="gmshOnelabSetString") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + type(c_ptr) :: value(*) + integer(c_size_t), value :: value_n + integer(c_int) :: ierr + end subroutine gmshOnelabSetString + + !> Get the value of the number parameter `name' from the ONELAB database. + !! Return an empty vector if the parameter does not exist. + subroutine gmshOnelabGetNumber(name, value, value_n, ierr) bind(C, name="gmshOnelabGetNumber") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + type(c_ptr), intent(out) :: value + integer(c_size_t) :: value_n + integer(c_int) :: ierr + end subroutine gmshOnelabGetNumber + + !> Get the value of the string parameter `name' from the ONELAB database. + !! Return an empty vector if the parameter does not exist. + subroutine gmshOnelabGetString(name, value, value_n, ierr) bind(C, name="gmshOnelabGetString") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + type(c_ptr), intent(out) :: value + integer(c_size_t) :: value_n + integer(c_int) :: ierr + end subroutine gmshOnelabGetString + + !> Check if any parameters in the ONELAB database used by the client `name' + !! have been changed. + function gmshOnelabGetChanged(name, ierr) bind(C, name="gmshOnelabGetChanged") + use, intrinsic :: iso_c_binding + integer(c_int) :: gmshOnelabGetChanged + character(len=1, kind=c_char) :: name(*) + integer(c_int) :: ierr + end function gmshOnelabGetChanged + + !> Set the changed flag to value `value' for all the parameters in the ONELAB + !! database used by the client `name'. + subroutine gmshOnelabSetChanged(name, value, ierr) bind(C, name="gmshOnelabSetChanged") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + integer(c_int), value :: value + integer(c_int) :: ierr + end subroutine gmshOnelabSetChanged + + !> Clear the ONELAB database, or remove a single parameter if `name' is given. + subroutine gmshOnelabClear(name, ierr) bind(C, name="gmshOnelabClear") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + integer(c_int) :: ierr + end subroutine gmshOnelabClear + + !> Run a ONELAB client. If `name' is provided, create a new ONELAB client with + !! name `name' and executes `command'. If not, try to run a client that might + !! be linked to the processed input files. + subroutine gmshOnelabRun(name, command, ierr) bind(C, name="gmshOnelabRun") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: name(*) + character(len=1, kind=c_char) :: command(*) + integer(c_int) :: ierr + end subroutine gmshOnelabRun + + !> Write a `message'. `level' can be "info", "warning" or "error". + subroutine gmshLoggerWrite(message, level, ierr) bind(C, name="gmshLoggerWrite") + use, intrinsic :: iso_c_binding + character(len=1, kind=c_char) :: message(*) + character(len=1, kind=c_char) :: level(*) + integer(c_int) :: ierr + end subroutine gmshLoggerWrite + + !> Start logging messages. + subroutine gmshLoggerStart(ierr) bind(C, name="gmshLoggerStart") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshLoggerStart + + !> Get logged messages. + subroutine gmshLoggerGet(log, log_n, ierr) bind(C, name="gmshLoggerGet") + use, intrinsic :: iso_c_binding + type(c_ptr), intent(out) :: log + integer(c_size_t) :: log_n + integer(c_int) :: ierr + end subroutine gmshLoggerGet + + !> Stop logging messages. + subroutine gmshLoggerStop(ierr) bind(C, name="gmshLoggerStop") + use, intrinsic :: iso_c_binding + integer(c_int) :: ierr + end subroutine gmshLoggerStop + + !> Return wall clock time. + function gmshLoggerGetWallTime(ierr) bind(C, name="gmshLoggerGetWallTime") + use, intrinsic :: iso_c_binding + real(c_double) :: gmshLoggerGetWallTime + integer(c_int) :: ierr + end function gmshLoggerGetWallTime + + !> Return CPU time. + function gmshLoggerGetCpuTime(ierr) bind(C, name="gmshLoggerGetCpuTime") + use, intrinsic :: iso_c_binding + real(c_double) :: gmshLoggerGetCpuTime + integer(c_int) :: ierr + end function gmshLoggerGetCpuTime + + !> Return last error message, if any. + subroutine gmshLoggerGetLastError(error, ierr) bind(C, name="gmshLoggerGetLastError") + use, intrinsic :: iso_c_binding + type(c_ptr) :: error(*) + integer(c_int) :: ierr + end subroutine gmshLoggerGetLastError + + end interface +end module gmsh diff --git a/api/gmshf.h b/api/gmshf.h deleted file mode 100644 index ba672f9c3a740612f8f92bc84f7c89d96fa2e434..0000000000000000000000000000000000000000 --- a/api/gmshf.h +++ /dev/null @@ -1,7156 +0,0 @@ -c -c Gmsh - Copyright (C) 1997-2022 C. Geuzaine, J.-F. Remacle -c -c See the LICENSE.txt file in the Gmsh root directory for license information. -c Please report all issues on https://gitlab.onelab.info/gmsh/gmsh/issues. -c - -!DEC$ IF DEFINED (GMSHF_H) -!DEC$ ELSE -!DEC$ DEFINE GMSHF_H - -c -c This file defines the Gmsh Fortran API (v4.10.4). -c -c Do not edit this file directly: it is automatically generated by `api/gen.py'. -c -c By design, the Gmsh Fortran API is purely functional, and only uses elementary -c Fortran types. See `tutorials/fortran' and `examples/api' for tutorials and -c examples. -c - -!DEC$ DEFINE GMSH_API_VERSION_MAJOR = 4 -!DEC$ DEFINE GMSH_API_VERSION_MINOR = 10 -!DEC$ DEFINE GMSH_API_VERSION_PATCH = 4 - - module gmsh_fortran - - use, intrinsic :: iso_c_binding - - character(len = 5), parameter :: GMSH_API_VERSION = "4.10.4" - real(c_double), parameter::M_PI = 3.14159265358979323846d0 - - interface - -! Initialize the Gmsh API. This must be called before any call to the other -! functions in the API. If `argc' and `argv' (or just `argv' in Python or -! Julia) are provided, they will be handled in the same way as the command -! line arguments in the Gmsh app. If `readConfigFiles' is set, read system -! Gmsh configuration files (gmshrc and gmsh-options). If `run' is set, run in -! the same way as the Gmsh app, either interactively or in batch mode -! depending on the command line arguments. If `run' is not set, initializing -! the API sets the options "General.AbortOnError" to 2 and "General.Terminal" -! to 1. If compiled with OpenMP support, it also sets the number of threads -! to "General.NumThreads". - subroutine gmshInitialize( - & argc, - & argv, - & readConfigFiles, - & run, - & ierr) - & bind(C, name = "gmshInitialize") - use, intrinsic :: iso_c_binding - integer (C_INT), value :: argc - type (C_PTR)::argv(*) - integer(c_int), value::readConfigFiles - integer(c_int), value::run - integer(c_int)::ierr - end subroutine gmshInitialize - -! Return 1 if the Gmsh API is initialized, and 0 if not. - function gmshIsInitialized( - & ierr) - & bind(C, name = "gmshIsInitialized") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshIsInitialized - integer(c_int)::ierr - end function gmshIsInitialized - -! Finalize the Gmsh API. This must be called when you are done using the Gmsh -! API. - subroutine gmshFinalize( - & ierr) - & bind(C, name = "gmshFinalize") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshFinalize - -! Open a file. Equivalent to the `File->Open' menu in the Gmsh app. Handling -! of the file depends on its extension and/or its contents: opening a file -! with model data will create a new model. - subroutine gmshOpen( - & fileName, - & ierr) - & bind(C, name = "gmshOpen") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::fileName(*) - integer(c_int)::ierr - end subroutine gmshOpen - -! Merge a file. Equivalent to the `File->Merge' menu in the Gmsh app. -! Handling of the file depends on its extension and/or its contents. Merging -! a file with model data will add the data to the current model. - subroutine gmshMerge( - & fileName, - & ierr) - & bind(C, name = "gmshMerge") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::fileName(*) - integer(c_int)::ierr - end subroutine gmshMerge - -! Write a file. The export format is determined by the file extension. - subroutine gmshWrite( - & fileName, - & ierr) - & bind(C, name = "gmshWrite") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::fileName(*) - integer(c_int)::ierr - end subroutine gmshWrite - -! Clear all loaded models and post-processing data, and add a new empty -! model. - subroutine gmshClear( - & ierr) - & bind(C, name = "gmshClear") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshClear - -! Set a numerical option to `value'. `name' is of the form "Category.Option" -! or "Category[num].Option". Available categories and options are listed in -! the Gmsh reference manual. - subroutine gmshOptionSetNumber( - & name, - & value, - & ierr) - & bind(C, name = "gmshOptionSetNumber") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - real(c_double), value::value - integer(c_int)::ierr - end subroutine gmshOptionSetNumber - -! Get the `value' of a numerical option. `name' is of the form -! "Category.Option" or "Category[num].Option". Available categories and -! options are listed in the Gmsh reference manual. - subroutine gmshOptionGetNumber( - & name, - & value, - & ierr) - & bind(C, name = "gmshOptionGetNumber") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - real(c_double)::value - integer(c_int)::ierr - end subroutine gmshOptionGetNumber - -! Set a string option to `value'. `name' is of the form "Category.Option" or -! "Category[num].Option". Available categories and options are listed in the -! Gmsh reference manual. - subroutine gmshOptionSetString( - & name, - & value, - & ierr) - & bind(C, name = "gmshOptionSetString") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - character(len = 1, kind = c_char)::value(*) - integer(c_int)::ierr - end subroutine gmshOptionSetString - -! Get the `value' of a string option. `name' is of the form "Category.Option" -! or "Category[num].Option". Available categories and options are listed in -! the Gmsh reference manual. - subroutine gmshOptionGetString( - & name, - & value, - & ierr) - & bind(C, name = "gmshOptionGetString") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - type(c_ptr)::value(*) - integer(c_int)::ierr - end subroutine gmshOptionGetString - -! Set a color option to the RGBA value (`r', `g', `b', `a'), where where `r', -! `g', `b' and `a' should be integers between 0 and 255. `name' is of the -! form "Category.Color.Option" or "Category[num].Color.Option". Available -! categories and options are listed in the Gmsh reference manual. For -! conciseness "Color." can be ommitted in `name'. - subroutine gmshOptionSetColor( - & name, - & r, - & g, - & b, - & a, - & ierr) - & bind(C, name = "gmshOptionSetColor") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - integer(c_int), value::r - integer(c_int), value::g - integer(c_int), value::b - integer(c_int), value::a - integer(c_int)::ierr - end subroutine gmshOptionSetColor - -! Get the `r', `g', `b', `a' value of a color option. `name' is of the form -! "Category.Color.Option" or "Category[num].Color.Option". Available -! categories and options are listed in the Gmsh reference manual. For -! conciseness "Color." can be ommitted in `name'. - subroutine gmshOptionGetColor( - & name, - & r, - & g, - & b, - & a, - & ierr) - & bind(C, name = "gmshOptionGetColor") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - integer(c_int)::r - integer(c_int)::g - integer(c_int)::b - integer(c_int)::a - integer(c_int)::ierr - end subroutine gmshOptionGetColor - -! Add a new model, with name `name', and set it as the current model. - subroutine gmshModelAdd( - & name, - & ierr) - & bind(C, name = "gmshModelAdd") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - integer(c_int)::ierr - end subroutine gmshModelAdd - -! Remove the current model. - subroutine gmshModelRemove( - & ierr) - & bind(C, name = "gmshModelRemove") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshModelRemove - -! List the names of all models. - subroutine gmshModelList( - & names, - & names_n, - & ierr) - & bind(C, name = "gmshModelList") - use, intrinsic :: iso_c_binding - type(c_ptr), intent(out)::names - integer(c_size_t) :: names_n - integer(c_int)::ierr - end subroutine gmshModelList - -! Get the name of the current model. - subroutine gmshModelGetCurrent( - & name, - & ierr) - & bind(C, name = "gmshModelGetCurrent") - use, intrinsic :: iso_c_binding - type(c_ptr)::name(*) - integer(c_int)::ierr - end subroutine gmshModelGetCurrent - -! Set the current model to the model with name `name'. If several models have -! the same name, select the one that was added first. - subroutine gmshModelSetCurrent( - & name, - & ierr) - & bind(C, name = "gmshModelSetCurrent") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - integer(c_int)::ierr - end subroutine gmshModelSetCurrent - -! Get the file name (if any) associated with the current model. A file name -! is associated when a model is read from a file on disk. - subroutine gmshModelGetFileName( - & fileName, - & ierr) - & bind(C, name = "gmshModelGetFileName") - use, intrinsic :: iso_c_binding - type(c_ptr)::fileName(*) - integer(c_int)::ierr - end subroutine gmshModelGetFileName - -! Set the file name associated with the current model. - subroutine gmshModelSetFileName( - & fileName, - & ierr) - & bind(C, name = "gmshModelSetFileName") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::fileName(*) - integer(c_int)::ierr - end subroutine gmshModelSetFileName - -! Get all the entities in the current model. If `dim' is >= 0, return only -! the entities of the specified dimension (e.g. points if `dim' == 0). The -! entities are returned as a vector of (dim, tag) integer pairs. - subroutine gmshModelGetEntities( - & dimTags, - & dimTags_n, - & dim, - & ierr) - & bind(C, name = "gmshModelGetEntities") - use, intrinsic :: iso_c_binding - type(c_ptr), intent(out)::dimTags - integer(c_size_t) :: dimTags_n - integer(c_int), value::dim - integer(c_int)::ierr - end subroutine gmshModelGetEntities - -! Set the name of the entity of dimension `dim' and tag `tag'. - subroutine gmshModelSetEntityName( - & dim, - & tag, - & name, - & ierr) - & bind(C, name = "gmshModelSetEntityName") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - character(len = 1, kind = c_char)::name(*) - integer(c_int)::ierr - end subroutine gmshModelSetEntityName - -! Get the name of the entity of dimension `dim' and tag `tag'. - subroutine gmshModelGetEntityName( - & dim, - & tag, - & name, - & ierr) - & bind(C, name = "gmshModelGetEntityName") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - type(c_ptr)::name(*) - integer(c_int)::ierr - end subroutine gmshModelGetEntityName - -! Get all the physical groups in the current model. If `dim' is >= 0, return -! only the entities of the specified dimension (e.g. physical points if `dim' -! == 0). The entities are returned as a vector of (dim, tag) integer pairs. - subroutine gmshModelGetPhysicalGroups( - & dimTags, - & dimTags_n, - & dim, - & ierr) - & bind(C, name = "gmshModelGetPhysicalGroups") - use, intrinsic :: iso_c_binding - type(c_ptr), intent(out)::dimTags - integer(c_size_t) :: dimTags_n - integer(c_int), value::dim - integer(c_int)::ierr - end subroutine gmshModelGetPhysicalGroups - -! Get the tags of the model entities making up the physical group of -! dimension `dim' and tag `tag'. - subroutine gmshModelGetEntitiesForPhysicalGroup( - & dim, - & tag, - & tags, - & tags_n, - & ierr) - & bind(C, name = "gmshModelGetEntitiesForPhysicalGroup") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - type(c_ptr), intent(out)::tags - integer(c_size_t) :: tags_n - integer(c_int)::ierr - end subroutine gmshModelGetEntitiesForPhysicalGroup - -! Get the tags of the physical groups (if any) to which the model entity of -! dimension `dim' and tag `tag' belongs. - subroutine gmshModelGetPhysicalGroupsForEntity( - & dim, - & tag, - & physicalTags, - & physicalTags_n, - & ierr) - & bind(C, name = "gmshModelGetPhysicalGroupsForEntity") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - type(c_ptr), intent(out)::physicalTags - integer(c_size_t) :: physicalTags_n - integer(c_int)::ierr - end subroutine gmshModelGetPhysicalGroupsForEntity - -! Add a physical group of dimension `dim', grouping the model entities with -! tags `tags'. Return the tag of the physical group, equal to `tag' if `tag' -! is positive, or a new tag if `tag' < 0. Set the name of the physical group -! if `name' is not empty. - function gmshModelAddPhysicalGroup( - & dim, - & tags, - & tags_n, - & tag, - & name, - & ierr) - & bind(C, name = "gmshModelAddPhysicalGroup") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelAddPhysicalGroup - integer(c_int), value::dim - integer(c_int)::tags(*) - integer(c_size_t), value :: tags_n - integer(c_int), value::tag - character(len = 1, kind = c_char)::name(*) - integer(c_int)::ierr - end function gmshModelAddPhysicalGroup - -! Remove the physical groups `dimTags' from the current model. If `dimTags' -! is empty, remove all groups. - subroutine gmshModelRemovePhysicalGroups( - & dimTags, - & dimTags_n, - & ierr) - & bind(C, name = "gmshModelRemovePhysicalGroups") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int)::ierr - end subroutine gmshModelRemovePhysicalGroups - -! Set the name of the physical group of dimension `dim' and tag `tag'. - subroutine gmshModelSetPhysicalName( - & dim, - & tag, - & name, - & ierr) - & bind(C, name = "gmshModelSetPhysicalName") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - character(len = 1, kind = c_char)::name(*) - integer(c_int)::ierr - end subroutine gmshModelSetPhysicalName - -! Remove the physical name `name' from the current model. - subroutine gmshModelRemovePhysicalName( - & name, - & ierr) - & bind(C, name = "gmshModelRemovePhysicalName") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - integer(c_int)::ierr - end subroutine gmshModelRemovePhysicalName - -! Get the name of the physical group of dimension `dim' and tag `tag'. - subroutine gmshModelGetPhysicalName( - & dim, - & tag, - & name, - & ierr) - & bind(C, name = "gmshModelGetPhysicalName") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - type(c_ptr)::name(*) - integer(c_int)::ierr - end subroutine gmshModelGetPhysicalName - -! Set the tag of the entity of dimension `dim' and tag `tag' to the new value -! `newTag'. - subroutine gmshModelSetTag( - & dim, - & tag, - & newTag, - & ierr) - & bind(C, name = "gmshModelSetTag") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int), value::newTag - integer(c_int)::ierr - end subroutine gmshModelSetTag - -! Get the boundary of the model entities `dimTags'. Return in `outDimTags' -! the boundary of the individual entities (if `combined' is false) or the -! boundary of the combined geometrical shape formed by all input entities (if -! `combined' is true). Return tags multiplied by the sign of the boundary -! entity if `oriented' is true. Apply the boundary operator recursively down -! to dimension 0 (i.e. to points) if `recursive' is true. - subroutine gmshModelGetBoundary( - & dimTags, - & dimTags_n, - & outDimTags, - & outDimTags_n, - & combined, - & oriented, - & recursive, - & ierr) - & bind(C, name = "gmshModelGetBoundary") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - integer(c_int), value::combined - integer(c_int), value::oriented - integer(c_int), value::recursive - integer(c_int)::ierr - end subroutine gmshModelGetBoundary - -! Get the upward and downward adjacencies of the model entity of dimension -! `dim' and tag `tag'. The `upward' vector returns the adjacent entities of -! dimension `dim' + 1; the `downward' vector returns the adjacent entities of -! dimension `dim' - 1. - subroutine gmshModelGetAdjacencies( - & dim, - & tag, - & upward, - & upward_n, - & downward, - & downward_n, - & ierr) - & bind(C, name = "gmshModelGetAdjacencies") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - type(c_ptr), intent(out)::upward - integer(c_size_t) :: upward_n - type(c_ptr), intent(out)::downward - integer(c_size_t) :: downward_n - integer(c_int)::ierr - end subroutine gmshModelGetAdjacencies - -! Get the model entities in the bounding box defined by the two points -! (`xmin', `ymin', `zmin') and (`xmax', `ymax', `zmax'). If `dim' is >= 0, -! return only the entities of the specified dimension (e.g. points if `dim' -! == 0). - subroutine gmshModelGetEntitiesInBoundingBox( - & xmin, - & ymin, - & zmin, - & xmax, - & ymax, - & zmax, - & tags, - & tags_n, - & dim, - & ierr) - & bind(C, name = "gmshModelGetEntitiesInBoundingBox") - use, intrinsic :: iso_c_binding - real(c_double), value::xmin - real(c_double), value::ymin - real(c_double), value::zmin - real(c_double), value::xmax - real(c_double), value::ymax - real(c_double), value::zmax - type(c_ptr), intent(out)::tags - integer(c_size_t) :: tags_n - integer(c_int), value::dim - integer(c_int)::ierr - end subroutine gmshModelGetEntitiesInBoundingBox - -! Get the bounding box (`xmin', `ymin', `zmin'), (`xmax', `ymax', `zmax') of -! the model entity of dimension `dim' and tag `tag'. If `dim' and `tag' are -! negative, get the bounding box of the whole model. - subroutine gmshModelGetBoundingBox( - & dim, - & tag, - & xmin, - & ymin, - & zmin, - & xmax, - & ymax, - & zmax, - & ierr) - & bind(C, name = "gmshModelGetBoundingBox") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - real(c_double)::xmin - real(c_double)::ymin - real(c_double)::zmin - real(c_double)::xmax - real(c_double)::ymax - real(c_double)::zmax - integer(c_int)::ierr - end subroutine gmshModelGetBoundingBox - -! Return the geometrical dimension of the current model. - function gmshModelGetDimension( - & ierr) - & bind(C, name = "gmshModelGetDimension") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGetDimension - integer(c_int)::ierr - end function gmshModelGetDimension - -! Add a discrete model entity (defined by a mesh) of dimension `dim' in the -! current model. Return the tag of the new discrete entity, equal to `tag' if -! `tag' is positive, or a new tag if `tag' < 0. `boundary' specifies the tags -! of the entities on the boundary of the discrete entity, if any. Specifying -! `boundary' allows Gmsh to construct the topology of the overall model. - function gmshModelAddDiscreteEntity( - & dim, - & tag, - & boundary, - & boundary_n, - & ierr) - & bind(C, name = "gmshModelAddDiscreteEntity") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelAddDiscreteEntity - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int)::boundary(*) - integer(c_size_t), value :: boundary_n - integer(c_int)::ierr - end function gmshModelAddDiscreteEntity - -! Remove the entities `dimTags' of the current model, provided that they are -! not on the boundary of (or embedded in) higher-dimensional entities. If -! `recursive' is true, remove all the entities on their boundaries, down to -! dimension 0. - subroutine gmshModelRemoveEntities( - & dimTags, - & dimTags_n, - & recursive, - & ierr) - & bind(C, name = "gmshModelRemoveEntities") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int), value::recursive - integer(c_int)::ierr - end subroutine gmshModelRemoveEntities - -! Remove the entity name `name' from the current model. - subroutine gmshModelRemoveEntityName( - & name, - & ierr) - & bind(C, name = "gmshModelRemoveEntityName") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - integer(c_int)::ierr - end subroutine gmshModelRemoveEntityName - -! Get the type of the entity of dimension `dim' and tag `tag'. - subroutine gmshModelGetType( - & dim, - & tag, - & entityType, - & ierr) - & bind(C, name = "gmshModelGetType") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - type(c_ptr)::entityType(*) - integer(c_int)::ierr - end subroutine gmshModelGetType - -! In a partitioned model, get the parent of the entity of dimension `dim' and -! tag `tag', i.e. from which the entity is a part of, if any. `parentDim' and -! `parentTag' are set to -1 if the entity has no parent. - subroutine gmshModelGetParent( - & dim, - & tag, - & parentDim, - & parentTag, - & ierr) - & bind(C, name = "gmshModelGetParent") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int)::parentDim - integer(c_int)::parentTag - integer(c_int)::ierr - end subroutine gmshModelGetParent - -! Return the number of partitions in the model. - function gmshModelGetNumberOfPartitions( - & ierr) - & bind(C, name = "gmshModelGetNumberOfPartitions") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGetNumberOfPartitions - integer(c_int)::ierr - end function gmshModelGetNumberOfPartitions - -! In a partitioned model, return the tags of the partition(s) to which the -! entity belongs. - subroutine gmshModelGetPartitions( - & dim, - & tag, - & partitions, - & partitions_n, - & ierr) - & bind(C, name = "gmshModelGetPartitions") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - type(c_ptr), intent(out)::partitions - integer(c_size_t) :: partitions_n - integer(c_int)::ierr - end subroutine gmshModelGetPartitions - -! Evaluate the parametrization of the entity of dimension `dim' and tag `tag' -! at the parametric coordinates `parametricCoord'. Only valid for `dim' equal -! to 0 (with empty `parametricCoord'), 1 (with `parametricCoord' containing -! parametric coordinates on the curve) or 2 (with `parametricCoord' -! containing pairs of u, v parametric coordinates on the surface, -! concatenated: [p1u, p1v, p2u, ...]). Return triplets of x, y, z coordinates -! in `coord', concatenated: [p1x, p1y, p1z, p2x, ...]. - subroutine gmshModelGetValue( - & dim, - & tag, - & parametricCoord, - & parametricCoord_n, - & coord, - & coord_n, - & ierr) - & bind(C, name = "gmshModelGetValue") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - real(c_double)::parametricCoord(*) - integer(c_size_t), value :: parametricCoord_n - type(c_ptr), intent(out)::coord - integer(c_size_t) :: coord_n - integer(c_int)::ierr - end subroutine gmshModelGetValue - -! Evaluate the derivative of the parametrization of the entity of dimension -! `dim' and tag `tag' at the parametric coordinates `parametricCoord'. Only -! valid for `dim' equal to 1 (with `parametricCoord' containing parametric -! coordinates on the curve) or 2 (with `parametricCoord' containing pairs of -! u, v parametric coordinates on the surface, concatenated: [p1u, p1v, p2u, -! ...]). For `dim' equal to 1 return the x, y, z components of the derivative -! with respect to u [d1ux, d1uy, d1uz, d2ux, ...]; for `dim' equal to 2 -! return the x, y, z components of the derivative with respect to u and v: -! [d1ux, d1uy, d1uz, d1vx, d1vy, d1vz, d2ux, ...]. - subroutine gmshModelGetDerivative( - & dim, - & tag, - & parametricCoord, - & parametricCoord_n, - & derivatives, - & derivatives_n, - & ierr) - & bind(C, name = "gmshModelGetDerivative") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - real(c_double)::parametricCoord(*) - integer(c_size_t), value :: parametricCoord_n - type(c_ptr), intent(out)::derivatives - integer(c_size_t) :: derivatives_n - integer(c_int)::ierr - end subroutine gmshModelGetDerivative - -! Evaluate the second derivative of the parametrization of the entity of -! dimension `dim' and tag `tag' at the parametric coordinates -! `parametricCoord'. Only valid for `dim' equal to 1 (with `parametricCoord' -! containing parametric coordinates on the curve) or 2 (with -! `parametricCoord' containing pairs of u, v parametric coordinates on the -! surface, concatenated: [p1u, p1v, p2u, ...]). For `dim' equal to 1 return -! the x, y, z components of the second derivative with respect to u [d1uux, -! d1uuy, d1uuz, d2uux, ...]; for `dim' equal to 2 return the x, y, z -! components of the second derivative with respect to u and v, and the mixed -! derivative with respect to u and v: [d1uux, d1uuy, d1uuz, d1vvx, d1vvy, -! d1vvz, d1uvx, d1uvy, d1uvz, d2uux, ...]. - subroutine gmshModelGetSecondDerivative( - & dim, - & tag, - & parametricCoord, - & parametricCoord_n, - & derivatives, - & derivatives_n, - & ierr) - & bind(C, name = "gmshModelGetSecondDerivative") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - real(c_double)::parametricCoord(*) - integer(c_size_t), value :: parametricCoord_n - type(c_ptr), intent(out)::derivatives - integer(c_size_t) :: derivatives_n - integer(c_int)::ierr - end subroutine gmshModelGetSecondDerivative - -! Evaluate the (maximum) curvature of the entity of dimension `dim' and tag -! `tag' at the parametric coordinates `parametricCoord'. Only valid for `dim' -! equal to 1 (with `parametricCoord' containing parametric coordinates on the -! curve) or 2 (with `parametricCoord' containing pairs of u, v parametric -! coordinates on the surface, concatenated: [p1u, p1v, p2u, ...]). - subroutine gmshModelGetCurvature( - & dim, - & tag, - & parametricCoord, - & parametricCoord_n, - & curvatures, - & curvatures_n, - & ierr) - & bind(C, name = "gmshModelGetCurvature") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - real(c_double)::parametricCoord(*) - integer(c_size_t), value :: parametricCoord_n - type(c_ptr), intent(out)::curvatures - integer(c_size_t) :: curvatures_n - integer(c_int)::ierr - end subroutine gmshModelGetCurvature - -! Evaluate the principal curvatures of the surface with tag `tag' at the -! parametric coordinates `parametricCoord', as well as their respective -! directions. `parametricCoord' are given by pair of u and v coordinates, -! concatenated: [p1u, p1v, p2u, ...]. - subroutine gmshModelGetPrincipalCurvatures( - & tag, - & parametricCoord, - & parametricCoord_n, - & curvatureMax, - & curvatureMax_n, - & curvatureMin, - & curvatureMin_n, - & directionMax, - & directionMax_n, - & directionMin, - & directionMin_n, - & ierr) - & bind(C, name = "gmshModelGetPrincipalCurvatures") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - real(c_double)::parametricCoord(*) - integer(c_size_t), value :: parametricCoord_n - type(c_ptr), intent(out)::curvatureMax - integer(c_size_t) :: curvatureMax_n - type(c_ptr), intent(out)::curvatureMin - integer(c_size_t) :: curvatureMin_n - type(c_ptr), intent(out)::directionMax - integer(c_size_t) :: directionMax_n - type(c_ptr), intent(out)::directionMin - integer(c_size_t) :: directionMin_n - integer(c_int)::ierr - end subroutine gmshModelGetPrincipalCurvatures - -! Get the normal to the surface with tag `tag' at the parametric coordinates -! `parametricCoord'. `parametricCoord' are given by pairs of u and v -! coordinates, concatenated: [p1u, p1v, p2u, ...]. `normals' are returned as -! triplets of x, y, z components, concatenated: [n1x, n1y, n1z, n2x, ...]. - subroutine gmshModelGetNormal( - & tag, - & parametricCoord, - & parametricCoord_n, - & normals, - & normals_n, - & ierr) - & bind(C, name = "gmshModelGetNormal") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - real(c_double)::parametricCoord(*) - integer(c_size_t), value :: parametricCoord_n - type(c_ptr), intent(out)::normals - integer(c_size_t) :: normals_n - integer(c_int)::ierr - end subroutine gmshModelGetNormal - -! Get the parametric coordinates `parametricCoord' for the points `coord' on -! the entity of dimension `dim' and tag `tag'. `coord' are given as triplets -! of x, y, z coordinates, concatenated: [p1x, p1y, p1z, p2x, ...]. -! `parametricCoord' returns the parametric coordinates t on the curve (if -! `dim' = 1) or pairs of u and v coordinates concatenated on the surface (if -! `dim' = 2), i.e. [p1t, p2t, ...] or [p1u, p1v, p2u, ...]. - subroutine gmshModelGetParametrization( - & dim, - & tag, - & coord, - & coord_n, - & parametricCoord, - & parametricCoord_n, - & ierr) - & bind(C, name = "gmshModelGetParametrization") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - real(c_double)::coord(*) - integer(c_size_t), value :: coord_n - type(c_ptr), intent(out)::parametricCoord - integer(c_size_t) :: parametricCoord_n - integer(c_int)::ierr - end subroutine gmshModelGetParametrization - -! Get the `min' and `max' bounds of the parametric coordinates for the entity -! of dimension `dim' and tag `tag'. - subroutine gmshModelGetParametrizationBounds( - & dim, - & tag, - & min, - & min_n, - & max, - & max_n, - & ierr) - & bind(C, name = "gmshModelGetParametrizationBounds") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - type(c_ptr), intent(out)::min - integer(c_size_t) :: min_n - type(c_ptr), intent(out)::max - integer(c_size_t) :: max_n - integer(c_int)::ierr - end subroutine gmshModelGetParametrizationBounds - -! Check if the coordinates (or the parametric coordinates if `parametric' is -! set) provided in `coord' correspond to points inside the entity of -! dimension `dim' and tag `tag', and return the number of points inside. This -! feature is only available for a subset of entities, depending on the -! underlying geometrical representation. - function gmshModelIsInside( - & dim, - & tag, - & coord, - & coord_n, - & parametric, - & ierr) - & bind(C, name = "gmshModelIsInside") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelIsInside - integer(c_int), value::dim - integer(c_int), value::tag - real(c_double)::coord(*) - integer(c_size_t), value :: coord_n - integer(c_int), value::parametric - integer(c_int)::ierr - end function gmshModelIsInside - -! Get the points `closestCoord' on the entity of dimension `dim' and tag -! `tag' to the points `coord', by orthogonal projection. `coord' and -! `closestCoord' are given as triplets of x, y, z coordinates, concatenated: -! [p1x, p1y, p1z, p2x, ...]. `parametricCoord' returns the parametric -! coordinates t on the curve (if `dim' = 1) or pairs of u and v coordinates -! concatenated on the surface (if `dim' = 2), i.e. [p1t, p2t, ...] or [p1u, -! p1v, p2u, ...]. - subroutine gmshModelGetClosestPoint( - & dim, - & tag, - & coord, - & coord_n, - & closestCoord, - & closestCoord_n, - & parametricCoord, - & parametricCoord_n, - & ierr) - & bind(C, name = "gmshModelGetClosestPoint") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - real(c_double)::coord(*) - integer(c_size_t), value :: coord_n - type(c_ptr), intent(out)::closestCoord - integer(c_size_t) :: closestCoord_n - type(c_ptr), intent(out)::parametricCoord - integer(c_size_t) :: parametricCoord_n - integer(c_int)::ierr - end subroutine gmshModelGetClosestPoint - -! Reparametrize the boundary entity (point or curve, i.e. with `dim' == 0 or -! `dim' == 1) of tag `tag' on the surface `surfaceTag'. If `dim' == 1, -! reparametrize all the points corresponding to the parametric coordinates -! `parametricCoord'. Multiple matches in case of periodic surfaces can be -! selected with `which'. This feature is only available for a subset of -! entities, depending on the underlying geometrical representation. - subroutine gmshModelReparametrizeOnSurface( - & dim, - & tag, - & parametricCoord, - & parametricCoord_n, - & surfaceTag, - & surfaceParametricCoord, - & surfaceParametricCoord_n, - & which, - & ierr) - & bind(C, name = "gmshModelReparametrizeOnSurface") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - real(c_double)::parametricCoord(*) - integer(c_size_t), value :: parametricCoord_n - integer(c_int), value::surfaceTag - type(c_ptr), intent(out)::surfaceParametricCoord - integer(c_size_t) :: surfaceParametricCoord_n - integer(c_int), value::which - integer(c_int)::ierr - end subroutine gmshModelReparametrizeOnSurface - -! Set the visibility of the model entities `dimTags' to `value'. Apply the -! visibility setting recursively if `recursive' is true. - subroutine gmshModelSetVisibility( - & dimTags, - & dimTags_n, - & value, - & recursive, - & ierr) - & bind(C, name = "gmshModelSetVisibility") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int), value::value - integer(c_int), value::recursive - integer(c_int)::ierr - end subroutine gmshModelSetVisibility - -! Get the visibility of the model entity of dimension `dim' and tag `tag'. - subroutine gmshModelGetVisibility( - & dim, - & tag, - & value, - & ierr) - & bind(C, name = "gmshModelGetVisibility") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int)::value - integer(c_int)::ierr - end subroutine gmshModelGetVisibility - -! Set the global visibility of the model per window to `value', where -! `windowIndex' identifies the window in the window list. - subroutine gmshModelSetVisibilityPerWindow( - & value, - & windowIndex, - & ierr) - & bind(C, name = "gmshModelSetVisibilityPerWindow") - use, intrinsic :: iso_c_binding - integer(c_int), value::value - integer(c_int), value::windowIndex - integer(c_int)::ierr - end subroutine gmshModelSetVisibilityPerWindow - -! Set the color of the model entities `dimTags' to the RGBA value (`r', `g', -! `b', `a'), where `r', `g', `b' and `a' should be integers between 0 and -! 255. Apply the color setting recursively if `recursive' is true. - subroutine gmshModelSetColor( - & dimTags, - & dimTags_n, - & r, - & g, - & b, - & a, - & recursive, - & ierr) - & bind(C, name = "gmshModelSetColor") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int), value::r - integer(c_int), value::g - integer(c_int), value::b - integer(c_int), value::a - integer(c_int), value::recursive - integer(c_int)::ierr - end subroutine gmshModelSetColor - -! Get the color of the model entity of dimension `dim' and tag `tag'. - subroutine gmshModelGetColor( - & dim, - & tag, - & r, - & g, - & b, - & a, - & ierr) - & bind(C, name = "gmshModelGetColor") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int)::r - integer(c_int)::g - integer(c_int)::b - integer(c_int)::a - integer(c_int)::ierr - end subroutine gmshModelGetColor - -! Set the `x', `y', `z' coordinates of a geometrical point. - subroutine gmshModelSetCoordinates( - & tag, - & x, - & y, - & z, - & ierr) - & bind(C, name = "gmshModelSetCoordinates") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - integer(c_int)::ierr - end subroutine gmshModelSetCoordinates - -! Generate a mesh of the current model, up to dimension `dim' (0, 1, 2 or 3). - subroutine gmshModelMeshGenerate( - & dim, - & ierr) - & bind(C, name = "gmshModelMeshGenerate") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int)::ierr - end subroutine gmshModelMeshGenerate - -! Partition the mesh of the current model into `numPart' partitions. -! Optionally, `elementTags' and `partitions' can be provided to specify the -! partition of each element explicitly. - subroutine gmshModelMeshPartition( - & numPart, - & elementTags, - & elementTags_n, - & partitions, - & partitions_n, - & ierr) - & bind(C, name = "gmshModelMeshPartition") - use, intrinsic :: iso_c_binding - integer(c_int), value::numPart - integer(c_size_t)::elementTags(*) - integer(c_size_t), value :: elementTags_n - integer(c_int)::partitions(*) - integer(c_size_t), value :: partitions_n - integer(c_int)::ierr - end subroutine gmshModelMeshPartition - -! Unpartition the mesh of the current model. - subroutine gmshModelMeshUnpartition( - & ierr) - & bind(C, name = "gmshModelMeshUnpartition") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshModelMeshUnpartition - -! Optimize the mesh of the current model using `method' (empty for default -! tetrahedral mesh optimizer, "Netgen" for Netgen optimizer, "HighOrder" for -! direct high-order mesh optimizer, "HighOrderElastic" for high-order elastic -! smoother, "HighOrderFastCurving" for fast curving algorithm, "Laplace2D" -! for Laplace smoothing, "Relocate2D" and "Relocate3D" for node relocation, -! "QuadQuasiStructured" for quad mesh optimization, "UntangleMeshGeometry" -! for untangling). If `force' is set apply the optimization also to discrete -! entities. If `dimTags' is given, only apply the optimizer to the given -! entities. - subroutine gmshModelMeshOptimize( - & method, - & force, - & niter, - & dimTags, - & dimTags_n, - & ierr) - & bind(C, name = "gmshModelMeshOptimize") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::method(*) - integer(c_int), value::force - integer(c_int), value::niter - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int)::ierr - end subroutine gmshModelMeshOptimize - -! Recombine the mesh of the current model. - subroutine gmshModelMeshRecombine( - & ierr) - & bind(C, name = "gmshModelMeshRecombine") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshModelMeshRecombine - -! Refine the mesh of the current model by uniformly splitting the elements. - subroutine gmshModelMeshRefine( - & ierr) - & bind(C, name = "gmshModelMeshRefine") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshModelMeshRefine - -! Set the order of the elements in the mesh of the current model to `order'. - subroutine gmshModelMeshSetOrder( - & order, - & ierr) - & bind(C, name = "gmshModelMeshSetOrder") - use, intrinsic :: iso_c_binding - integer(c_int), value::order - integer(c_int)::ierr - end subroutine gmshModelMeshSetOrder - -! Get the last entities (if any) where a meshing error occurred. Currently -! only populated by the new 3D meshing algorithms. - subroutine gmshModelMeshGetLastEntityError( - & dimTags, - & dimTags_n, - & ierr) - & bind(C, name = "gmshModelMeshGetLastEntityError") - use, intrinsic :: iso_c_binding - type(c_ptr), intent(out)::dimTags - integer(c_size_t) :: dimTags_n - integer(c_int)::ierr - end subroutine gmshModelMeshGetLastEntityError - -! Get the last nodes (if any) where a meshing error occurred. Currently only -! populated by the new 3D meshing algorithms. - subroutine gmshModelMeshGetLastNodeError( - & nodeTags, - & nodeTags_n, - & ierr) - & bind(C, name = "gmshModelMeshGetLastNodeError") - use, intrinsic :: iso_c_binding - type(c_ptr), intent(out)::nodeTags - integer(c_size_t) :: nodeTags_n - integer(c_int)::ierr - end subroutine gmshModelMeshGetLastNodeError - -! Clear the mesh, i.e. delete all the nodes and elements, for the entities -! `dimTags'. If `dimTags' is empty, clear the whole mesh. Note that the mesh -! of an entity can only be cleared if this entity is not on the boundary of -! another entity with a non-empty mesh. - subroutine gmshModelMeshClear( - & dimTags, - & dimTags_n, - & ierr) - & bind(C, name = "gmshModelMeshClear") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int)::ierr - end subroutine gmshModelMeshClear - -! Reverse the orientation of the elements in the entities `dimTags'. If -! `dimTags' is empty, reverse the orientation of the elements in the whole -! mesh. - subroutine gmshModelMeshReverse( - & dimTags, - & dimTags_n, - & ierr) - & bind(C, name = "gmshModelMeshReverse") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int)::ierr - end subroutine gmshModelMeshReverse - -! Apply the affine transformation `affineTransform' (16 entries of a 4x4 -! matrix, by row; only the 12 first can be provided for convenience) to the -! coordinates of the nodes classified on the entities `dimTags'. If `dimTags' -! is empty, transform all the nodes in the mesh. - subroutine gmshModelMeshAffineTransform( - & affineTransform, - & affineTransform_n, - & dimTags, - & dimTags_n, - & ierr) - & bind(C, name = "gmshModelMeshAffineTransform") - use, intrinsic :: iso_c_binding - real(c_double)::affineTransform(*) - integer(c_size_t), value :: affineTransform_n - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int)::ierr - end subroutine gmshModelMeshAffineTransform - -! Get the nodes classified on the entity of dimension `dim' and tag `tag'. If -! `tag' < 0, get the nodes for all entities of dimension `dim'. If `dim' and -! `tag' are negative, get all the nodes in the mesh. `nodeTags' contains the -! node tags (their unique, strictly positive identification numbers). `coord' -! is a vector of length 3 times the length of `nodeTags' that contains the x, -! y, z coordinates of the nodes, concatenated: [n1x, n1y, n1z, n2x, ...]. If -! `dim' >= 0 and `returnParamtricCoord' is set, `parametricCoord' contains -! the parametric coordinates ([u1, u2, ...] or [u1, v1, u2, ...]) of the -! nodes, if available. The length of `parametricCoord' can be 0 or `dim' -! times the length of `nodeTags'. If `includeBoundary' is set, also return -! the nodes classified on the boundary of the entity (which will be -! reparametrized on the entity if `dim' >= 0 in order to compute their -! parametric coordinates). - subroutine gmshModelMeshGetNodes( - & nodeTags, - & nodeTags_n, - & coord, - & coord_n, - & parametricCoord, - & parametricCoord_n, - & dim, - & tag, - & includeBoundary, - & returnParametricCoord, - & ierr) - & bind(C, name = "gmshModelMeshGetNodes") - use, intrinsic :: iso_c_binding - type(c_ptr), intent(out)::nodeTags - integer(c_size_t) :: nodeTags_n - type(c_ptr), intent(out)::coord - integer(c_size_t) :: coord_n - type(c_ptr), intent(out)::parametricCoord - integer(c_size_t) :: parametricCoord_n - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int), value::includeBoundary - integer(c_int), value::returnParametricCoord - integer(c_int)::ierr - end subroutine gmshModelMeshGetNodes - -! Get the nodes classified on the entity of tag `tag', for all the elements -! of type `elementType'. The other arguments are treated as in `getNodes'. - subroutine gmshModelMeshGetNodesByElementType( - & elementType, - & nodeTags, - & nodeTags_n, - & coord, - & coord_n, - & parametricCoord, - & parametricCoord_n, - & tag, - & returnParametricCoord, - & ierr) - & bind(C, name = "gmshModelMeshGetNodesByElementType") - use, intrinsic :: iso_c_binding - integer(c_int), value::elementType - type(c_ptr), intent(out)::nodeTags - integer(c_size_t) :: nodeTags_n - type(c_ptr), intent(out)::coord - integer(c_size_t) :: coord_n - type(c_ptr), intent(out)::parametricCoord - integer(c_size_t) :: parametricCoord_n - integer(c_int), value::tag - integer(c_int), value::returnParametricCoord - integer(c_int)::ierr - end subroutine gmshModelMeshGetNodesByElementType - -! Get the coordinates and the parametric coordinates (if any) of the node -! with tag `tag', as well as the dimension `dim' and tag `tag' of the entity -! on which the node is classified. This function relies on an internal cache -! (a vector in case of dense node numbering, a map otherwise); for large -! meshes accessing nodes in bulk is often preferable. - subroutine gmshModelMeshGetNode( - & nodeTag, - & coord, - & coord_n, - & parametricCoord, - & parametricCoord_n, - & dim, - & tag, - & ierr) - & bind(C, name = "gmshModelMeshGetNode") - use, intrinsic :: iso_c_binding - integer(c_size_t), value::nodeTag - type(c_ptr), intent(out)::coord - integer(c_size_t) :: coord_n - type(c_ptr), intent(out)::parametricCoord - integer(c_size_t) :: parametricCoord_n - integer(c_int)::dim - integer(c_int)::tag - integer(c_int)::ierr - end subroutine gmshModelMeshGetNode - -! Set the coordinates and the parametric coordinates (if any) of the node -! with tag `tag'. This function relies on an internal cache (a vector in case -! of dense node numbering, a map otherwise); for large meshes accessing nodes -! in bulk is often preferable. - subroutine gmshModelMeshSetNode( - & nodeTag, - & coord, - & coord_n, - & parametricCoord, - & parametricCoord_n, - & ierr) - & bind(C, name = "gmshModelMeshSetNode") - use, intrinsic :: iso_c_binding - integer(c_size_t), value::nodeTag - real(c_double)::coord(*) - integer(c_size_t), value :: coord_n - real(c_double)::parametricCoord(*) - integer(c_size_t), value :: parametricCoord_n - integer(c_int)::ierr - end subroutine gmshModelMeshSetNode - -! Rebuild the node cache. - subroutine gmshModelMeshRebuildNodeCache( - & onlyIfNecessary, - & ierr) - & bind(C, name = "gmshModelMeshRebuildNodeCache") - use, intrinsic :: iso_c_binding - integer(c_int), value::onlyIfNecessary - integer(c_int)::ierr - end subroutine gmshModelMeshRebuildNodeCache - -! Rebuild the element cache. - subroutine gmshModelMeshRebuildElementCache( - & onlyIfNecessary, - & ierr) - & bind(C, name = "gmshModelMeshRebuildElementCache") - use, intrinsic :: iso_c_binding - integer(c_int), value::onlyIfNecessary - integer(c_int)::ierr - end subroutine gmshModelMeshRebuildElementCache - -! Get the nodes from all the elements belonging to the physical group of -! dimension `dim' and tag `tag'. `nodeTags' contains the node tags; `coord' -! is a vector of length 3 times the length of `nodeTags' that contains the x, -! y, z coordinates of the nodes, concatenated: [n1x, n1y, n1z, n2x, ...]. - subroutine gmshModelMeshGetNodesForPhysicalGroup( - & dim, - & tag, - & nodeTags, - & nodeTags_n, - & coord, - & coord_n, - & ierr) - & bind(C, name = "gmshModelMeshGetNodesForPhysicalGroup") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - type(c_ptr), intent(out)::nodeTags - integer(c_size_t) :: nodeTags_n - type(c_ptr), intent(out)::coord - integer(c_size_t) :: coord_n - integer(c_int)::ierr - end subroutine gmshModelMeshGetNodesForPhysicalGroup - -! Get the maximum tag `maxTag' of a node in the mesh. - subroutine gmshModelMeshGetMaxNodeTag( - & maxTag, - & ierr) - & bind(C, name = "gmshModelMeshGetMaxNodeTag") - use, intrinsic :: iso_c_binding - integer(c_size_t)::maxTag - integer(c_int)::ierr - end subroutine gmshModelMeshGetMaxNodeTag - -! Add nodes classified on the model entity of dimension `dim' and tag `tag'. -! `nodeTags' contains the node tags (their unique, strictly positive -! identification numbers). `coord' is a vector of length 3 times the length -! of `nodeTags' that contains the x, y, z coordinates of the nodes, -! concatenated: [n1x, n1y, n1z, n2x, ...]. The optional `parametricCoord' -! vector contains the parametric coordinates of the nodes, if any. The length -! of `parametricCoord' can be 0 or `dim' times the length of `nodeTags'. If -! the `nodeTags' vector is empty, new tags are automatically assigned to the -! nodes. - subroutine gmshModelMeshAddNodes( - & dim, - & tag, - & nodeTags, - & nodeTags_n, - & coord, - & coord_n, - & parametricCoord, - & parametricCoord_n, - & ierr) - & bind(C, name = "gmshModelMeshAddNodes") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_size_t)::nodeTags(*) - integer(c_size_t), value :: nodeTags_n - real(c_double)::coord(*) - integer(c_size_t), value :: coord_n - real(c_double)::parametricCoord(*) - integer(c_size_t), value :: parametricCoord_n - integer(c_int)::ierr - end subroutine gmshModelMeshAddNodes - -! Reclassify all nodes on their associated model entity, based on the -! elements. Can be used when importing nodes in bulk (e.g. by associating -! them all to a single volume), to reclassify them correctly on model -! surfaces, curves, etc. after the elements have been set. - subroutine gmshModelMeshReclassifyNodes( - & ierr) - & bind(C, name = "gmshModelMeshReclassifyNodes") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshModelMeshReclassifyNodes - -! Relocate the nodes classified on the entity of dimension `dim' and tag -! `tag' using their parametric coordinates. If `tag' < 0, relocate the nodes -! for all entities of dimension `dim'. If `dim' and `tag' are negative, -! relocate all the nodes in the mesh. - subroutine gmshModelMeshRelocateNodes( - & dim, - & tag, - & ierr) - & bind(C, name = "gmshModelMeshRelocateNodes") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int)::ierr - end subroutine gmshModelMeshRelocateNodes - -! Get the elements classified on the entity of dimension `dim' and tag `tag'. -! If `tag' < 0, get the elements for all entities of dimension `dim'. If -! `dim' and `tag' are negative, get all the elements in the mesh. -! `elementTypes' contains the MSH types of the elements (e.g. `2' for 3-node -! triangles: see `getElementProperties' to obtain the properties for a given -! element type). `elementTags' is a vector of the same length as -! `elementTypes'; each entry is a vector containing the tags (unique, -! strictly positive identifiers) of the elements of the corresponding type. -! `nodeTags' is also a vector of the same length as `elementTypes'; each -! entry is a vector of length equal to the number of elements of the given -! type times the number N of nodes for this type of element, that contains -! the node tags of all the elements of the given type, concatenated: [e1n1, -! e1n2, ..., e1nN, e2n1, ...]. - subroutine gmshModelMeshGetElements( - & elementTypes, - & elementTypes_n, - & elementTags, - & elementTags_n, - & elementTags_nn, - & nodeTags, - & nodeTags_n, - & nodeTags_nn, - & dim, - & tag, - & ierr) - & bind(C, name = "gmshModelMeshGetElements") - use, intrinsic :: iso_c_binding - type(c_ptr), intent(out)::elementTypes - integer(c_size_t) :: elementTypes_n - type (c_ptr), intent(out)::elementTags - type(c_ptr), intent(out) :: elementTags_n - integer(c_size_t) :: elementTags_nn - type (c_ptr), intent(out)::nodeTags - type(c_ptr), intent(out) :: nodeTags_n - integer(c_size_t) :: nodeTags_nn - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int)::ierr - end subroutine gmshModelMeshGetElements - -! Get the type and node tags of the element with tag `tag', as well as the -! dimension `dim' and tag `tag' of the entity on which the element is -! classified. This function relies on an internal cache (a vector in case of -! dense element numbering, a map otherwise); for large meshes accessing -! elements in bulk is often preferable. - subroutine gmshModelMeshGetElement( - & elementTag, - & elementType, - & nodeTags, - & nodeTags_n, - & dim, - & tag, - & ierr) - & bind(C, name = "gmshModelMeshGetElement") - use, intrinsic :: iso_c_binding - integer(c_size_t), value::elementTag - integer(c_int)::elementType - type(c_ptr), intent(out)::nodeTags - integer(c_size_t) :: nodeTags_n - integer(c_int)::dim - integer(c_int)::tag - integer(c_int)::ierr - end subroutine gmshModelMeshGetElement - -! Search the mesh for an element located at coordinates (`x', `y', `z'). This -! function performs a search in a spatial octree. If an element is found, -! return its tag, type and node tags, as well as the local coordinates (`u', -! `v', `w') within the reference element corresponding to search location. If -! `dim' is >= 0, only search for elements of the given dimension. If `strict' -! is not set, use a tolerance to find elements near the search location. - subroutine gmshModelMeshGetElementByCoordinates( - & x, - & y, - & z, - & elementTag, - & elementType, - & nodeTags, - & nodeTags_n, - & u, - & v, - & w, - & dim, - & strict, - & ierr) - & bind(C, name = "gmshModelMeshGetElementByCoordinates") - use, intrinsic :: iso_c_binding - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - integer(c_size_t)::elementTag - integer(c_int)::elementType - type(c_ptr), intent(out)::nodeTags - integer(c_size_t) :: nodeTags_n - real(c_double)::u - real(c_double)::v - real(c_double)::w - integer(c_int), value::dim - integer(c_int), value::strict - integer(c_int)::ierr - end subroutine gmshModelMeshGetElementByCoordinates - -! Search the mesh for element(s) located at coordinates (`x', `y', `z'). This -! function performs a search in a spatial octree. Return the tags of all -! found elements in `elementTags'. Additional information about the elements -! can be accessed through `getElement' and `getLocalCoordinatesInElement'. If -! `dim' is >= 0, only search for elements of the given dimension. If `strict' -! is not set, use a tolerance to find elements near the search location. - subroutine gmshModelMeshGetElementsByCoordinates( - & x, - & y, - & z, - & elementTags, - & elementTags_n, - & dim, - & strict, - & ierr) - & bind(C, name = "gmshModelMeshGetElementsByCoordinates") - use, intrinsic :: iso_c_binding - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - type(c_ptr), intent(out)::elementTags - integer(c_size_t) :: elementTags_n - integer(c_int), value::dim - integer(c_int), value::strict - integer(c_int)::ierr - end subroutine gmshModelMeshGetElementsByCoordinates - -! Return the local coordinates (`u', `v', `w') within the element -! `elementTag' corresponding to the model coordinates (`x', `y', `z'). This -! function relies on an internal cache (a vector in case of dense element -! numbering, a map otherwise); for large meshes accessing elements in bulk is -! often preferable. - subroutine gmshModelMeshGetLocalCoordinatesInElement( - & elementTag, - & x, - & y, - & z, - & u, - & v, - & w, - & ierr) - & bind(C, name = "gmshModelMeshGetLocalCoordinatesInElement") - use, intrinsic :: iso_c_binding - integer(c_size_t), value::elementTag - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - real(c_double)::u - real(c_double)::v - real(c_double)::w - integer(c_int)::ierr - end subroutine gmshModelMeshGetLocalCoordinatesInElement - -! Get the types of elements in the entity of dimension `dim' and tag `tag'. -! If `tag' < 0, get the types for all entities of dimension `dim'. If `dim' -! and `tag' are negative, get all the types in the mesh. - subroutine gmshModelMeshGetElementTypes( - & elementTypes, - & elementTypes_n, - & dim, - & tag, - & ierr) - & bind(C, name = "gmshModelMeshGetElementTypes") - use, intrinsic :: iso_c_binding - type(c_ptr), intent(out)::elementTypes - integer(c_size_t) :: elementTypes_n - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int)::ierr - end subroutine gmshModelMeshGetElementTypes - -! Return an element type given its family name `familyName' ("Point", "Line", -! "Triangle", "Quadrangle", "Tetrahedron", "Pyramid", "Prism", "Hexahedron") -! and polynomial order `order'. If `serendip' is true, return the -! corresponding serendip element type (element without interior nodes). - function gmshModelMeshGetElementType( - & familyName, - & order, - & serendip, - & ierr) - & bind(C, name = "gmshModelMeshGetElementType") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelMeshGetElementType - character(len = 1, kind = c_char)::familyName(*) - integer(c_int), value::order - integer(c_int), value::serendip - integer(c_int)::ierr - end function gmshModelMeshGetElementType - -! Get the properties of an element of type `elementType': its name -! (`elementName'), dimension (`dim'), order (`order'), number of nodes -! (`numNodes'), local coordinates of the nodes in the reference element -! (`localNodeCoord' vector, of length `dim' times `numNodes') and number of -! primary (first order) nodes (`numPrimaryNodes'). - subroutine gmshModelMeshGetElementProperties( - & elementType, - & elementName, - & dim, - & order, - & numNodes, - & localNodeCoord, - & localNodeCoord_n, - & numPrimaryNodes, - & ierr) - & bind(C, name = "gmshModelMeshGetElementProperties") - use, intrinsic :: iso_c_binding - integer(c_int), value::elementType - type(c_ptr)::elementName(*) - integer(c_int)::dim - integer(c_int)::order - integer(c_int)::numNodes - type(c_ptr), intent(out)::localNodeCoord - integer(c_size_t) :: localNodeCoord_n - integer(c_int)::numPrimaryNodes - integer(c_int)::ierr - end subroutine gmshModelMeshGetElementProperties - -! Get the elements of type `elementType' classified on the entity of tag -! `tag'. If `tag' < 0, get the elements for all entities. `elementTags' is a -! vector containing the tags (unique, strictly positive identifiers) of the -! elements of the corresponding type. `nodeTags' is a vector of length equal -! to the number of elements of the given type times the number N of nodes for -! this type of element, that contains the node tags of all the elements of -! the given type, concatenated: [e1n1, e1n2, ..., e1nN, e2n1, ...]. If -! `numTasks' > 1, only compute and return the part of the data indexed by -! `task'. - subroutine gmshModelMeshGetElementsByType( - & elementType, - & elementTags, - & elementTags_n, - & nodeTags, - & nodeTags_n, - & tag, - & task, - & numTasks, - & ierr) - & bind(C, name = "gmshModelMeshGetElementsByType") - use, intrinsic :: iso_c_binding - integer(c_int), value::elementType - type(c_ptr), intent(out)::elementTags - integer(c_size_t) :: elementTags_n - type(c_ptr), intent(out)::nodeTags - integer(c_size_t) :: nodeTags_n - integer(c_int), value::tag - integer(c_size_t), value::task - integer(c_size_t), value::numTasks - integer(c_int)::ierr - end subroutine gmshModelMeshGetElementsByType - -! Get the maximum tag `maxTag' of an element in the mesh. - subroutine gmshModelMeshGetMaxElementTag( - & maxTag, - & ierr) - & bind(C, name = "gmshModelMeshGetMaxElementTag") - use, intrinsic :: iso_c_binding - integer(c_size_t)::maxTag - integer(c_int)::ierr - end subroutine gmshModelMeshGetMaxElementTag - -! Preallocate data before calling `getElementsByType' with `numTasks' > 1. -! For C and C++ only. - subroutine gmshModelMeshPreallocateElementsByType( - & elementType, - & elementTag, - & nodeTag, - & elementTags, - & elementTags_n, - & nodeTags, - & nodeTags_n, - & tag, - & ierr) - & bind(C, name = "gmshModelMeshPreallocateElementsByType") - use, intrinsic :: iso_c_binding - integer(c_int), value::elementType - integer(c_int), value::elementTag - integer(c_int), value::nodeTag - type(c_ptr), intent(out)::elementTags - integer(c_size_t) :: elementTags_n - type(c_ptr), intent(out)::nodeTags - integer(c_size_t) :: nodeTags_n - integer(c_int), value::tag - integer(c_int)::ierr - end subroutine gmshModelMeshPreallocateElementsByType - -! Get the quality `elementQualities' of the elements with tags `elementTags'. -! `qualityType' is the requested quality measure: "minSJ" for the minimal -! scaled jacobien, "minSICN" for the minimal signed inverted condition -! number, "minSIGE" for the signed inverted gradient error, "gamma" for the -! ratio of the inscribed to circumcribed sphere radius, "volume" for the -! volume. If `numTasks' > 1, only compute and return the part of the data -! indexed by `task'. - subroutine gmshModelMeshGetElementQualities( - & elementTags, - & elementTags_n, - & elementsQuality, - & elementsQuality_n, - & qualityName, - & task, - & numTasks, - & ierr) - & bind(C, name = "gmshModelMeshGetElementQualities") - use, intrinsic :: iso_c_binding - integer(c_size_t)::elementTags(*) - integer(c_size_t), value :: elementTags_n - type(c_ptr), intent(out)::elementsQuality - integer(c_size_t) :: elementsQuality_n - character(len = 1, kind = c_char)::qualityName(*) - integer(c_size_t), value::task - integer(c_size_t), value::numTasks - integer(c_int)::ierr - end subroutine gmshModelMeshGetElementQualities - -! Add elements classified on the entity of dimension `dim' and tag `tag'. -! `types' contains the MSH types of the elements (e.g. `2' for 3-node -! triangles: see the Gmsh reference manual). `elementTags' is a vector of the -! same length as `types'; each entry is a vector containing the tags (unique, -! strictly positive identifiers) of the elements of the corresponding type. -! `nodeTags' is also a vector of the same length as `types'; each entry is a -! vector of length equal to the number of elements of the given type times -! the number N of nodes per element, that contains the node tags of all the -! elements of the given type, concatenated: [e1n1, e1n2, ..., e1nN, e2n1, -! ...]. - subroutine gmshModelMeshAddElements( - & dim, - & tag, - & elementTypes, - & elementTypes_n, - & elementTags, - & elementTags_n, - & elementTags_nn, - & nodeTags, - & nodeTags_n, - & nodeTags_nn, - & ierr) - & bind(C, name = "gmshModelMeshAddElements") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int)::elementTypes(*) - integer(c_size_t), value :: elementTypes_n - type(c_ptr), intent(out)::elementTags - type(c_ptr), intent(out) :: elementTags_n - integer(c_size_t) :: elementTags_nn - type(c_ptr), intent(out)::nodeTags - type(c_ptr), intent(out) :: nodeTags_n - integer(c_size_t) :: nodeTags_nn - integer(c_int)::ierr - end subroutine gmshModelMeshAddElements - -! Add elements of type `elementType' classified on the entity of tag `tag'. -! `elementTags' contains the tags (unique, strictly positive identifiers) of -! the elements of the corresponding type. `nodeTags' is a vector of length -! equal to the number of elements times the number N of nodes per element, -! that contains the node tags of all the elements, concatenated: [e1n1, e1n2, -! ..., e1nN, e2n1, ...]. If the `elementTag' vector is empty, new tags are -! automatically assigned to the elements. - subroutine gmshModelMeshAddElementsByType( - & tag, - & elementType, - & elementTags, - & elementTags_n, - & nodeTags, - & nodeTags_n, - & ierr) - & bind(C, name = "gmshModelMeshAddElementsByType") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - integer(c_int), value::elementType - integer(c_size_t)::elementTags(*) - integer(c_size_t), value :: elementTags_n - integer(c_size_t)::nodeTags(*) - integer(c_size_t), value :: nodeTags_n - integer(c_int)::ierr - end subroutine gmshModelMeshAddElementsByType - -! Get the numerical quadrature information for the given element type -! `elementType' and integration rule `integrationType', where -! `integrationType' concatenates the integration rule family name with the -! desired order (e.g. "Gauss4" for a quadrature suited for integrating 4th -! order polynomials). The "CompositeGauss" family uses tensor-product rules -! based the 1D Gauss-Legendre rule; the "Gauss" family uses an economic -! scheme when available (i.e. with a minimal number of points), and falls -! back to "CompositeGauss" otherwise. Note that integration points for the -! "Gauss" family can fall outside of the reference element for high-order -! rules. `localCoord' contains the u, v, w coordinates of the G integration -! points in the reference element: [g1u, g1v, g1w, ..., gGu, gGv, gGw]. -! `weights' contains the associated weights: [g1q, ..., gGq]. - subroutine gmshModelMeshGetIntegrationPoints( - & elementType, - & integrationType, - & localCoord, - & localCoord_n, - & weights, - & weights_n, - & ierr) - & bind(C, name = "gmshModelMeshGetIntegrationPoints") - use, intrinsic :: iso_c_binding - integer(c_int), value::elementType - character(len = 1, kind = c_char)::integrationType(*) - type(c_ptr), intent(out)::localCoord - integer(c_size_t) :: localCoord_n - type(c_ptr), intent(out)::weights - integer(c_size_t) :: weights_n - integer(c_int)::ierr - end subroutine gmshModelMeshGetIntegrationPoints - -! Get the Jacobians of all the elements of type `elementType' classified on -! the entity of tag `tag', at the G evaluation points `localCoord' given as -! concatenated triplets of coordinates in the reference element [g1u, g1v, -! g1w, ..., gGu, gGv, gGw]. Data is returned by element, with elements in the -! same order as in `getElements' and `getElementsByType'. `jacobians' -! contains for each element the 9 entries of the 3x3 Jacobian matrix at each -! evaluation point. The matrix is returned by column: [e1g1Jxu, e1g1Jyu, -! e1g1Jzu, e1g1Jxv, ..., e1g1Jzw, e1g2Jxu, ..., e1gGJzw, e2g1Jxu, ...], with -! Jxu=dx/du, Jyu=dy/du, etc. `determinants' contains for each element the -! determinant of the Jacobian matrix at each evaluation point: [e1g1, e1g2, -! ... e1gG, e2g1, ...]. `coord' contains for each element the x, y, z -! coordinates of the evaluation points. If `tag' < 0, get the Jacobian data -! for all entities. If `numTasks' > 1, only compute and return the part of -! the data indexed by `task'. - subroutine gmshModelMeshGetJacobians( - & elementType, - & localCoord, - & localCoord_n, - & jacobians, - & jacobians_n, - & determinants, - & determinants_n, - & coord, - & coord_n, - & tag, - & task, - & numTasks, - & ierr) - & bind(C, name = "gmshModelMeshGetJacobians") - use, intrinsic :: iso_c_binding - integer(c_int), value::elementType - real(c_double)::localCoord(*) - integer(c_size_t), value :: localCoord_n - type(c_ptr), intent(out)::jacobians - integer(c_size_t) :: jacobians_n - type(c_ptr), intent(out)::determinants - integer(c_size_t) :: determinants_n - type(c_ptr), intent(out)::coord - integer(c_size_t) :: coord_n - integer(c_int), value::tag - integer(c_size_t), value::task - integer(c_size_t), value::numTasks - integer(c_int)::ierr - end subroutine gmshModelMeshGetJacobians - -! Preallocate data before calling `getJacobians' with `numTasks' > 1. For C -! and C++ only. - subroutine gmshModelMeshPreallocateJacobians( - & elementType, - & numEvaluationPoints, - & allocateJacobians, - & allocateDeterminants, - & allocateCoord, - & jacobians, - & jacobians_n, - & determinants, - & determinants_n, - & coord, - & coord_n, - & tag, - & ierr) - & bind(C, name = "gmshModelMeshPreallocateJacobians") - use, intrinsic :: iso_c_binding - integer(c_int), value::elementType - integer(c_int), value::numEvaluationPoints - integer(c_int), value::allocateJacobians - integer(c_int), value::allocateDeterminants - integer(c_int), value::allocateCoord - type(c_ptr), intent(out)::jacobians - integer(c_size_t) :: jacobians_n - type(c_ptr), intent(out)::determinants - integer(c_size_t) :: determinants_n - type(c_ptr), intent(out)::coord - integer(c_size_t) :: coord_n - integer(c_int), value::tag - integer(c_int)::ierr - end subroutine gmshModelMeshPreallocateJacobians - -! Get the Jacobian for a single element `elementTag', at the G evaluation -! points `localCoord' given as concatenated triplets of coordinates in the -! reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]. `jacobians' contains -! the 9 entries of the 3x3 Jacobian matrix at each evaluation point. The -! matrix is returned by column: [e1g1Jxu, e1g1Jyu, e1g1Jzu, e1g1Jxv, ..., -! e1g1Jzw, e1g2Jxu, ..., e1gGJzw, e2g1Jxu, ...], with Jxu=dx/du, Jyu=dy/du, -! etc. `determinants' contains the determinant of the Jacobian matrix at each -! evaluation point. `coord' contains the x, y, z coordinates of the -! evaluation points. This function relies on an internal cache (a vector in -! case of dense element numbering, a map otherwise); for large meshes -! accessing Jacobians in bulk is often preferable. - subroutine gmshModelMeshGetJacobian( - & elementTag, - & localCoord, - & localCoord_n, - & jacobians, - & jacobians_n, - & determinants, - & determinants_n, - & coord, - & coord_n, - & ierr) - & bind(C, name = "gmshModelMeshGetJacobian") - use, intrinsic :: iso_c_binding - integer(c_size_t), value::elementTag - real(c_double)::localCoord(*) - integer(c_size_t), value :: localCoord_n - type(c_ptr), intent(out)::jacobians - integer(c_size_t) :: jacobians_n - type(c_ptr), intent(out)::determinants - integer(c_size_t) :: determinants_n - type(c_ptr), intent(out)::coord - integer(c_size_t) :: coord_n - integer(c_int)::ierr - end subroutine gmshModelMeshGetJacobian - -! Get the basis functions of the element of type `elementType' at the -! evaluation points `localCoord' (given as concatenated triplets of -! coordinates in the reference element [g1u, g1v, g1w, ..., gGu, gGv, gGw]), -! for the function space `functionSpaceType'. Currently supported function -! spaces include "Lagrange" and "GradLagrange" for isoparametric Lagrange -! basis functions and their gradient in the u, v, w coordinates of the -! reference element; "LagrangeN" and "GradLagrangeN", with N = 1, 2, ..., for -! N-th order Lagrange basis functions; "H1LegendreN" and "GradH1LegendreN", -! with N = 1, 2, ..., for N-th order hierarchical H1 Legendre functions; -! "HcurlLegendreN" and "CurlHcurlLegendreN", with N = 1, 2, ..., for N-th -! order curl-conforming basis functions. `numComponents' returns the number C -! of components of a basis function (e.g. 1 for scalar functions and 3 for -! vector functions). `basisFunctions' returns the value of the N basis -! functions at the evaluation points, i.e. [g1f1, g1f2, ..., g1fN, g2f1, ...] -! when C == 1 or [g1f1u, g1f1v, g1f1w, g1f2u, ..., g1fNw, g2f1u, ...] when C -! == 3. For basis functions that depend on the orientation of the elements, -! all values for the first orientation are returned first, followed by values -! for the second, etc. `numOrientations' returns the overall number of -! orientations. If `wantedOrientations' is not empty, only return the values -! for the desired orientation indices. - subroutine gmshModelMeshGetBasisFunctions( - & elementType, - & localCoord, - & localCoord_n, - & functionSpaceType, - & numComponents, - & basisFunctions, - & basisFunctions_n, - & numOrientations, - & wantedOrientations, - & wantedOrientations_n, - & ierr) - & bind(C, name = "gmshModelMeshGetBasisFunctions") - use, intrinsic :: iso_c_binding - integer(c_int), value::elementType - real(c_double)::localCoord(*) - integer(c_size_t), value :: localCoord_n - character(len = 1, kind = c_char)::functionSpaceType(*) - integer(c_int)::numComponents - type(c_ptr), intent(out)::basisFunctions - integer(c_size_t) :: basisFunctions_n - integer(c_int)::numOrientations - integer(c_int)::wantedOrientations(*) - integer(c_size_t), value :: wantedOrientations_n - integer(c_int)::ierr - end subroutine gmshModelMeshGetBasisFunctions - -! Get the orientation index of the elements of type `elementType' in the -! entity of tag `tag'. The arguments have the same meaning as in -! `getBasisFunctions'. `basisFunctionsOrientation' is a vector giving for -! each element the orientation index in the values returned by -! `getBasisFunctions'. For Lagrange basis functions the call is superfluous -! as it will return a vector of zeros. - subroutine gmshModelMeshGetBasisFunctionsOrientation( - & elementType, - & functionSpaceType, - & basisFunctionsOrientation, - & basisFunctionsOrientation_n, - & tag, - & task, - & numTasks, - & ierr) - & bind(C, name = "gmshModelMeshGetBasisFunctionsOrientation") - use, intrinsic :: iso_c_binding - integer(c_int), value::elementType - character(len = 1, kind = c_char)::functionSpaceType(*) - type(c_ptr), intent(out)::basisFunctionsOrientation - integer(c_size_t) :: basisFunctionsOrientation_n - integer(c_int), value::tag - integer(c_size_t), value::task - integer(c_size_t), value::numTasks - integer(c_int)::ierr - end subroutine gmshModelMeshGetBasisFunctionsOrientation - -! Get the orientation of a single element `elementTag'. - -! Get the number of possible orientations for elements of type `elementType' -! and function space named `functionSpaceType'. - function gmshModelMeshGetNumberOfOrientations( - & elementType, - & functionSpaceType, - & ierr) - & bind(C, name = "gmshModelMeshGetNumberOfOrientations") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelMeshGetNumberOfOrientations - integer(c_int), value::elementType - character(len = 1, kind = c_char)::functionSpaceType(*) - integer(c_int)::ierr - end function gmshModelMeshGetNumberOfOrientations - -! Preallocate data before calling `getBasisFunctionsOrientation' with -! `numTasks' > 1. For C and C++ only. - -! Get the global unique mesh edge identifiers `edgeTags' and orientations -! `edgeOrientation' for an input list of node tag pairs defining these edges, -! concatenated in the vector `nodeTags'. Mesh edges are created e.g. by -! `createEdges()', `getKeys()' or `addEdges()'. The reference positive -! orientation is n1 < n2, where n1 and n2 are the tags of the two edge nodes, -! which corresponds to the local orientation of edge-based basis functions as -! well. - subroutine gmshModelMeshGetEdges( - & nodeTags, - & nodeTags_n, - & edgeTags, - & edgeTags_n, - & edgeOrientations, - & edgeOrientations_n, - & ierr) - & bind(C, name = "gmshModelMeshGetEdges") - use, intrinsic :: iso_c_binding - integer(c_size_t)::nodeTags(*) - integer(c_size_t), value :: nodeTags_n - type(c_ptr), intent(out)::edgeTags - integer(c_size_t) :: edgeTags_n - type(c_ptr), intent(out)::edgeOrientations - integer(c_size_t) :: edgeOrientations_n - integer(c_int)::ierr - end subroutine gmshModelMeshGetEdges - -! Get the global unique mesh face identifiers `faceTags' and orientations -! `faceOrientations' for an input list of node tag triplets (if `faceType' == -! 3) or quadruplets (if `faceType' == 4) defining these faces, concatenated -! in the vector `nodeTags'. Mesh faces are created e.g. by `createFaces()', -! `getKeys()' or `addFaces()'. - subroutine gmshModelMeshGetFaces( - & faceType, - & nodeTags, - & nodeTags_n, - & faceTags, - & faceTags_n, - & faceOrientations, - & faceOrientations_n, - & ierr) - & bind(C, name = "gmshModelMeshGetFaces") - use, intrinsic :: iso_c_binding - integer(c_int), value::faceType - integer(c_size_t)::nodeTags(*) - integer(c_size_t), value :: nodeTags_n - type(c_ptr), intent(out)::faceTags - integer(c_size_t) :: faceTags_n - type(c_ptr), intent(out)::faceOrientations - integer(c_size_t) :: faceOrientations_n - integer(c_int)::ierr - end subroutine gmshModelMeshGetFaces - -! Create unique mesh edges for the entities `dimTags'. - subroutine gmshModelMeshCreateEdges( - & dimTags, - & dimTags_n, - & ierr) - & bind(C, name = "gmshModelMeshCreateEdges") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int)::ierr - end subroutine gmshModelMeshCreateEdges - -! Create unique mesh faces for the entities `dimTags'. - subroutine gmshModelMeshCreateFaces( - & dimTags, - & dimTags_n, - & ierr) - & bind(C, name = "gmshModelMeshCreateFaces") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int)::ierr - end subroutine gmshModelMeshCreateFaces - -! Get the global unique identifiers `edgeTags' and the nodes `edgeNodes' of -! the edges in the mesh. Mesh edges are created e.g. by `createEdges()', -! `getKeys()' or addEdges(). - subroutine gmshModelMeshGetAllEdges( - & edgeTags, - & edgeTags_n, - & edgeNodes, - & edgeNodes_n, - & ierr) - & bind(C, name = "gmshModelMeshGetAllEdges") - use, intrinsic :: iso_c_binding - type(c_ptr), intent(out)::edgeTags - integer(c_size_t) :: edgeTags_n - type(c_ptr), intent(out)::edgeNodes - integer(c_size_t) :: edgeNodes_n - integer(c_int)::ierr - end subroutine gmshModelMeshGetAllEdges - -! Get the global unique identifiers `faceTags' and the nodes `faceNodes' of -! the faces of type `faceType' in the mesh. Mesh faces are created e.g. by -! `createFaces()', `getKeys()' or addFaces(). - subroutine gmshModelMeshGetAllFaces( - & faceType, - & faceTags, - & faceTags_n, - & faceNodes, - & faceNodes_n, - & ierr) - & bind(C, name = "gmshModelMeshGetAllFaces") - use, intrinsic :: iso_c_binding - integer(c_int), value::faceType - type(c_ptr), intent(out)::faceTags - integer(c_size_t) :: faceTags_n - type(c_ptr), intent(out)::faceNodes - integer(c_size_t) :: faceNodes_n - integer(c_int)::ierr - end subroutine gmshModelMeshGetAllFaces - -! Add mesh edges defined by their global unique identifiers `edgeTags' and -! their nodes `edgeNodes'. - subroutine gmshModelMeshAddEdges( - & edgeTags, - & edgeTags_n, - & edgeNodes, - & edgeNodes_n, - & ierr) - & bind(C, name = "gmshModelMeshAddEdges") - use, intrinsic :: iso_c_binding - integer(c_size_t)::edgeTags(*) - integer(c_size_t), value :: edgeTags_n - integer(c_size_t)::edgeNodes(*) - integer(c_size_t), value :: edgeNodes_n - integer(c_int)::ierr - end subroutine gmshModelMeshAddEdges - -! Add mesh faces of type `faceType' defined by their global unique -! identifiers `faceTags' and their nodes `faceNodes'. - subroutine gmshModelMeshAddFaces( - & faceType, - & faceTags, - & faceTags_n, - & faceNodes, - & faceNodes_n, - & ierr) - & bind(C, name = "gmshModelMeshAddFaces") - use, intrinsic :: iso_c_binding - integer(c_int), value::faceType - integer(c_size_t)::faceTags(*) - integer(c_size_t), value :: faceTags_n - integer(c_size_t)::faceNodes(*) - integer(c_size_t), value :: faceNodes_n - integer(c_int)::ierr - end subroutine gmshModelMeshAddFaces - -! Generate the pair of keys for the elements of type `elementType' in the -! entity of tag `tag', for the `functionSpaceType' function space. Each pair -! (`typeKey', `entityKey') uniquely identifies a basis function in the -! function space. If `returnCoord' is set, the `coord' vector contains the x, -! y, z coordinates locating basis functions for sorting purposes. Warning: -! this is an experimental feature and will probably change in a future -! release. - subroutine gmshModelMeshGetKeys( - & elementType, - & functionSpaceType, - & typeKeys, - & typeKeys_n, - & entityKeys, - & entityKeys_n, - & coord, - & coord_n, - & tag, - & returnCoord, - & ierr) - & bind(C, name = "gmshModelMeshGetKeys") - use, intrinsic :: iso_c_binding - integer(c_int), value::elementType - character(len = 1, kind = c_char)::functionSpaceType(*) - type(c_ptr), intent(out)::typeKeys - integer(c_size_t) :: typeKeys_n - type(c_ptr), intent(out)::entityKeys - integer(c_size_t) :: entityKeys_n - type(c_ptr), intent(out)::coord - integer(c_size_t) :: coord_n - integer(c_int), value::tag - integer(c_int), value::returnCoord - integer(c_int)::ierr - end subroutine gmshModelMeshGetKeys - -! Get the pair of keys for a single element `elementTag'. - subroutine gmshModelMeshGetKeysForElement( - & elementTag, - & functionSpaceType, - & typeKeys, - & typeKeys_n, - & entityKeys, - & entityKeys_n, - & coord, - & coord_n, - & returnCoord, - & ierr) - & bind(C, name = "gmshModelMeshGetKeysForElement") - use, intrinsic :: iso_c_binding - integer(c_size_t), value::elementTag - character(len = 1, kind = c_char)::functionSpaceType(*) - type(c_ptr), intent(out)::typeKeys - integer(c_size_t) :: typeKeys_n - type(c_ptr), intent(out)::entityKeys - integer(c_size_t) :: entityKeys_n - type(c_ptr), intent(out)::coord - integer(c_size_t) :: coord_n - integer(c_int), value::returnCoord - integer(c_int)::ierr - end subroutine gmshModelMeshGetKeysForElement - -! Get the number of keys by elements of type `elementType' for function space -! named `functionSpaceType'. - function gmshModelMeshGetNumberOfKeys( - & elementType, - & functionSpaceType, - & ierr) - & bind(C, name = "gmshModelMeshGetNumberOfKeys") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelMeshGetNumberOfKeys - integer(c_int), value::elementType - character(len = 1, kind = c_char)::functionSpaceType(*) - integer(c_int)::ierr - end function gmshModelMeshGetNumberOfKeys - -! Get information about the pair of `keys'. `infoKeys' returns information -! about the functions associated with the pairs (`typeKeys', `entityKey'). -! `infoKeys[0].first' describes the type of function (0 for vertex function, -! 1 for edge function, 2 for face function and 3 for bubble function). -! `infoKeys[0].second' gives the order of the function associated with the -! key. Warning: this is an experimental feature and will probably change in a -! future release. - subroutine gmshModelMeshGetKeysInformation( - & typeKeys, - & typeKeys_n, - & entityKeys, - & entityKeys_n, - & elementType, - & functionSpaceType, - & infoKeys, - & infoKeys_n, - & ierr) - & bind(C, name = "gmshModelMeshGetKeysInformation") - use, intrinsic :: iso_c_binding - integer(c_int)::typeKeys(*) - integer(c_size_t), value :: typeKeys_n - integer(c_size_t)::entityKeys(*) - integer(c_size_t), value :: entityKeys_n - integer(c_int), value::elementType - character(len = 1, kind = c_char)::functionSpaceType(*) - type(c_ptr), intent(out)::infoKeys - integer(c_size_t) :: infoKeys_n - integer(c_int)::ierr - end subroutine gmshModelMeshGetKeysInformation - -! Get the barycenters of all elements of type `elementType' classified on the -! entity of tag `tag'. If `primary' is set, only the primary nodes of the -! elements are taken into account for the barycenter calculation. If `fast' -! is set, the function returns the sum of the primary node coordinates -! (without normalizing by the number of nodes). If `tag' < 0, get the -! barycenters for all entities. If `numTasks' > 1, only compute and return -! the part of the data indexed by `task'. - subroutine gmshModelMeshGetBarycenters( - & elementType, - & tag, - & fast, - & primary, - & barycenters, - & barycenters_n, - & task, - & numTasks, - & ierr) - & bind(C, name = "gmshModelMeshGetBarycenters") - use, intrinsic :: iso_c_binding - integer(c_int), value::elementType - integer(c_int), value::tag - integer(c_int), value::fast - integer(c_int), value::primary - type(c_ptr), intent(out)::barycenters - integer(c_size_t) :: barycenters_n - integer(c_size_t), value::task - integer(c_size_t), value::numTasks - integer(c_int)::ierr - end subroutine gmshModelMeshGetBarycenters - -! Preallocate data before calling `getBarycenters' with `numTasks' > 1. For C -! and C++ only. - subroutine gmshModelMeshPreallocateBarycenters( - & elementType, - & barycenters, - & barycenters_n, - & tag, - & ierr) - & bind(C, name = "gmshModelMeshPreallocateBarycenters") - use, intrinsic :: iso_c_binding - integer(c_int), value::elementType - type(c_ptr), intent(out)::barycenters - integer(c_size_t) :: barycenters_n - integer(c_int), value::tag - integer(c_int)::ierr - end subroutine gmshModelMeshPreallocateBarycenters - -! Get the nodes on the edges of all elements of type `elementType' classified -! on the entity of tag `tag'. `nodeTags' contains the node tags of the edges -! for all the elements: [e1a1n1, e1a1n2, e1a2n1, ...]. Data is returned by -! element, with elements in the same order as in `getElements' and -! `getElementsByType'. If `primary' is set, only the primary (begin/end) -! nodes of the edges are returned. If `tag' < 0, get the edge nodes for all -! entities. If `numTasks' > 1, only compute and return the part of the data -! indexed by `task'. - subroutine gmshModelMeshGetElementEdgeNodes( - & elementType, - & nodeTags, - & nodeTags_n, - & tag, - & primary, - & task, - & numTasks, - & ierr) - & bind(C, name = "gmshModelMeshGetElementEdgeNodes") - use, intrinsic :: iso_c_binding - integer(c_int), value::elementType - type(c_ptr), intent(out)::nodeTags - integer(c_size_t) :: nodeTags_n - integer(c_int), value::tag - integer(c_int), value::primary - integer(c_size_t), value::task - integer(c_size_t), value::numTasks - integer(c_int)::ierr - end subroutine gmshModelMeshGetElementEdgeNodes - -! Get the nodes on the faces of type `faceType' (3 for triangular faces, 4 -! for quadrangular faces) of all elements of type `elementType' classified on -! the entity of tag `tag'. `nodeTags' contains the node tags of the faces for -! all elements: [e1f1n1, ..., e1f1nFaceType, e1f2n1, ...]. Data is returned -! by element, with elements in the same order as in `getElements' and -! `getElementsByType'. If `primary' is set, only the primary (corner) nodes -! of the faces are returned. If `tag' < 0, get the face nodes for all -! entities. If `numTasks' > 1, only compute and return the part of the data -! indexed by `task'. - subroutine gmshModelMeshGetElementFaceNodes( - & elementType, - & faceType, - & nodeTags, - & nodeTags_n, - & tag, - & primary, - & task, - & numTasks, - & ierr) - & bind(C, name = "gmshModelMeshGetElementFaceNodes") - use, intrinsic :: iso_c_binding - integer(c_int), value::elementType - integer(c_int), value::faceType - type(c_ptr), intent(out)::nodeTags - integer(c_size_t) :: nodeTags_n - integer(c_int), value::tag - integer(c_int), value::primary - integer(c_size_t), value::task - integer(c_size_t), value::numTasks - integer(c_int)::ierr - end subroutine gmshModelMeshGetElementFaceNodes - -! Get the ghost elements `elementTags' and their associated `partitions' -! stored in the ghost entity of dimension `dim' and tag `tag'. - subroutine gmshModelMeshGetGhostElements( - & dim, - & tag, - & elementTags, - & elementTags_n, - & partitions, - & partitions_n, - & ierr) - & bind(C, name = "gmshModelMeshGetGhostElements") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - type(c_ptr), intent(out)::elementTags - integer(c_size_t) :: elementTags_n - type(c_ptr), intent(out)::partitions - integer(c_size_t) :: partitions_n - integer(c_int)::ierr - end subroutine gmshModelMeshGetGhostElements - -! Set a mesh size constraint on the model entities `dimTags'. Currently only -! entities of dimension 0 (points) are handled. - subroutine gmshModelMeshSetSize( - & dimTags, - & dimTags_n, - & size, - & ierr) - & bind(C, name = "gmshModelMeshSetSize") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::size - integer(c_int)::ierr - end subroutine gmshModelMeshSetSize - -! Get the mesh size constraints (if any) associated with the model entities -! `dimTags'. A zero entry in the output `sizes' vector indicates that no size -! constraint is specified on the corresponding entity. - subroutine gmshModelMeshGetSizes( - & dimTags, - & dimTags_n, - & sizes, - & sizes_n, - & ierr) - & bind(C, name = "gmshModelMeshGetSizes") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - type(c_ptr), intent(out)::sizes - integer(c_size_t) :: sizes_n - integer(c_int)::ierr - end subroutine gmshModelMeshGetSizes - -! Set mesh size constraints at the given parametric points `parametricCoord' -! on the model entity of dimension `dim' and tag `tag'. Currently only -! entities of dimension 1 (lines) are handled. - subroutine gmshModelMeshSetSizeAtParametricPoints( - & dim, - & tag, - & parametricCoord, - & parametricCoord_n, - & sizes, - & sizes_n, - & ierr) - & bind(C, name = "gmshModelMeshSetSizeAtParametricPoints") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - real(c_double)::parametricCoord(*) - integer(c_size_t), value :: parametricCoord_n - real(c_double)::sizes(*) - integer(c_size_t), value :: sizes_n - integer(c_int)::ierr - end subroutine gmshModelMeshSetSizeAtParametricPoints - -! Set a mesh size callback for the current model. The callback function -! should take six arguments as input (`dim', `tag', `x', `y', `z' and `lc'). -! The first two integer arguments correspond to the dimension `dim' and tag -! `tag' of the entity being meshed. The next four double precision arguments -! correspond to the coordinates `x', `y' and `z' around which to prescribe -! the mesh size and to the mesh size `lc' that would be prescribed if the -! callback had not been called. The callback function should return a double -! precision number specifying the desired mesh size; returning `lc' is -! equivalent to a no-op. - subroutine gmshModelMeshSetSizeCallback( - & callback, - & ierr) - & bind(C, name = "gmshModelMeshSetSizeCallback") - use, intrinsic :: iso_c_binding - type (C_FUNPTR)::callback ! to do - integer(c_int)::ierr - end subroutine gmshModelMeshSetSizeCallback - -! Remove the mesh size callback from the current model. - subroutine gmshModelMeshRemoveSizeCallback( - & ierr) - & bind(C, name = "gmshModelMeshRemoveSizeCallback") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshModelMeshRemoveSizeCallback - -! Set a transfinite meshing constraint on the curve `tag', with `numNodes' -! nodes distributed according to `meshType' and `coef'. Currently supported -! types are "Progression" (geometrical progression with power `coef'), "Bump" -! (refinement toward both extremities of the curve) and "Beta" (beta law). - subroutine gmshModelMeshSetTransfiniteCurve( - & tag, - & numNodes, - & meshType, - & coef, - & ierr) - & bind(C, name = "gmshModelMeshSetTransfiniteCurve") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - integer(c_int), value::numNodes - character(len = 1, kind = c_char)::meshType(*) - real(c_double), value::coef - integer(c_int)::ierr - end subroutine gmshModelMeshSetTransfiniteCurve - -! Set a transfinite meshing constraint on the surface `tag'. `arrangement' -! describes the arrangement of the triangles when the surface is not flagged -! as recombined: currently supported values are "Left", "Right", -! "AlternateLeft" and "AlternateRight". `cornerTags' can be used to specify -! the (3 or 4) corners of the transfinite interpolation explicitly; -! specifying the corners explicitly is mandatory if the surface has more that -! 3 or 4 points on its boundary. - subroutine gmshModelMeshSetTransfiniteSurface( - & tag, - & arrangement, - & cornerTags, - & cornerTags_n, - & ierr) - & bind(C, name = "gmshModelMeshSetTransfiniteSurface") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - character(len = 1, kind = c_char)::arrangement(*) - integer(c_int)::cornerTags(*) - integer(c_size_t), value :: cornerTags_n - integer(c_int)::ierr - end subroutine gmshModelMeshSetTransfiniteSurface - -! Set a transfinite meshing constraint on the surface `tag'. `cornerTags' can -! be used to specify the (6 or 8) corners of the transfinite interpolation -! explicitly. - subroutine gmshModelMeshSetTransfiniteVolume( - & tag, - & cornerTags, - & cornerTags_n, - & ierr) - & bind(C, name = "gmshModelMeshSetTransfiniteVolume") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - integer(c_int)::cornerTags(*) - integer(c_size_t), value :: cornerTags_n - integer(c_int)::ierr - end subroutine gmshModelMeshSetTransfiniteVolume - -! Set transfinite meshing constraints on the model entities in `dimTag'. -! Transfinite meshing constraints are added to the curves of the quadrangular -! surfaces and to the faces of 6-sided volumes. Quadragular faces with a -! corner angle superior to `cornerAngle' (in radians) are ignored. The number -! of points is automatically determined from the sizing constraints. If -! `dimTag' is empty, the constraints are applied to all entities in the -! model. If `recombine' is true, the recombine flag is automatically set on -! the transfinite surfaces. - subroutine gmshModelMeshSetTransfiniteAutomatic( - & dimTags, - & dimTags_n, - & cornerAngle, - & recombine, - & ierr) - & bind(C, name = "gmshModelMeshSetTransfiniteAutomatic") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::cornerAngle - integer(c_int), value::recombine - integer(c_int)::ierr - end subroutine gmshModelMeshSetTransfiniteAutomatic - -! Set a recombination meshing constraint on the model entity of dimension -! `dim' and tag `tag'. Currently only entities of dimension 2 (to recombine -! triangles into quadrangles) are supported; `angle' specifies the threshold -! angle for the simple recombination algorithm.. - subroutine gmshModelMeshSetRecombine( - & dim, - & tag, - & angle, - & ierr) - & bind(C, name = "gmshModelMeshSetRecombine") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - real(c_double), value::angle - integer(c_int)::ierr - end subroutine gmshModelMeshSetRecombine - -! Set a smoothing meshing constraint on the model entity of dimension `dim' -! and tag `tag'. `val' iterations of a Laplace smoother are applied. - subroutine gmshModelMeshSetSmoothing( - & dim, - & tag, - & val, - & ierr) - & bind(C, name = "gmshModelMeshSetSmoothing") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int), value::val - integer(c_int)::ierr - end subroutine gmshModelMeshSetSmoothing - -! Set a reverse meshing constraint on the model entity of dimension `dim' and -! tag `tag'. If `val' is true, the mesh orientation will be reversed with -! respect to the natural mesh orientation (i.e. the orientation consistent -! with the orientation of the geometry). If `val' is false, the mesh is left -! as-is. - subroutine gmshModelMeshSetReverse( - & dim, - & tag, - & val, - & ierr) - & bind(C, name = "gmshModelMeshSetReverse") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int), value::val - integer(c_int)::ierr - end subroutine gmshModelMeshSetReverse - -! Set the meshing algorithm on the model entity of dimension `dim' and tag -! `tag'. Currently only supported for `dim' == 2. - subroutine gmshModelMeshSetAlgorithm( - & dim, - & tag, - & val, - & ierr) - & bind(C, name = "gmshModelMeshSetAlgorithm") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int), value::val - integer(c_int)::ierr - end subroutine gmshModelMeshSetAlgorithm - -! Force the mesh size to be extended from the boundary, or not, for the model -! entity of dimension `dim' and tag `tag'. Currently only supported for `dim' -! == 2. - subroutine gmshModelMeshSetSizeFromBoundary( - & dim, - & tag, - & val, - & ierr) - & bind(C, name = "gmshModelMeshSetSizeFromBoundary") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int), value::val - integer(c_int)::ierr - end subroutine gmshModelMeshSetSizeFromBoundary - -! Set a compound meshing constraint on the model entities of dimension `dim' -! and tags `tags'. During meshing, compound entities are treated as a single -! discrete entity, which is automatically reparametrized. - subroutine gmshModelMeshSetCompound( - & dim, - & tags, - & tags_n, - & ierr) - & bind(C, name = "gmshModelMeshSetCompound") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int)::tags(*) - integer(c_size_t), value :: tags_n - integer(c_int)::ierr - end subroutine gmshModelMeshSetCompound - -! Set meshing constraints on the bounding surfaces of the volume of tag `tag' -! so that all surfaces are oriented with outward pointing normals; and if a -! mesh already exists, reorient it. Currently only available with the -! OpenCASCADE kernel, as it relies on the STL triangulation. - subroutine gmshModelMeshSetOutwardOrientation( - & tag, - & ierr) - & bind(C, name = "gmshModelMeshSetOutwardOrientation") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - integer(c_int)::ierr - end subroutine gmshModelMeshSetOutwardOrientation - -! Remove all meshing constraints from the model entities `dimTags'. If -! `dimTags' is empty, remove all constraings. - subroutine gmshModelMeshRemoveConstraints( - & dimTags, - & dimTags_n, - & ierr) - & bind(C, name = "gmshModelMeshRemoveConstraints") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int)::ierr - end subroutine gmshModelMeshRemoveConstraints - -! Embed the model entities of dimension `dim' and tags `tags' in the -! (`inDim', `inTag') model entity. The dimension `dim' can 0, 1 or 2 and must -! be strictly smaller than `inDim', which must be either 2 or 3. The embedded -! entities should not intersect each other or be part of the boundary of the -! entity `inTag', whose mesh will conform to the mesh of the embedded -! entities. With the OpenCASCADE kernel, if the `fragment' operation is -! applied to entities of different dimensions, the lower dimensional entities -! will be automatically embedded in the higher dimensional entities if they -! are not on their boundary. - subroutine gmshModelMeshEmbed( - & dim, - & tags, - & tags_n, - & inDim, - & inTag, - & ierr) - & bind(C, name = "gmshModelMeshEmbed") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int)::tags(*) - integer(c_size_t), value :: tags_n - integer(c_int), value::inDim - integer(c_int), value::inTag - integer(c_int)::ierr - end subroutine gmshModelMeshEmbed - -! Remove embedded entities from the model entities `dimTags'. if `dim' is >= -! 0, only remove embedded entities of the given dimension (e.g. embedded -! points if `dim' == 0). - subroutine gmshModelMeshRemoveEmbedded( - & dimTags, - & dimTags_n, - & dim, - & ierr) - & bind(C, name = "gmshModelMeshRemoveEmbedded") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int), value::dim - integer(c_int)::ierr - end subroutine gmshModelMeshRemoveEmbedded - -! Get the entities (if any) embedded in the model entity of dimension `dim' -! and tag `tag'. - subroutine gmshModelMeshGetEmbedded( - & dim, - & tag, - & dimTags, - & dimTags_n, - & ierr) - & bind(C, name = "gmshModelMeshGetEmbedded") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - type(c_ptr), intent(out)::dimTags - integer(c_size_t) :: dimTags_n - integer(c_int)::ierr - end subroutine gmshModelMeshGetEmbedded - -! Reorder the elements of type `elementType' classified on the entity of tag -! `tag' according to `ordering'. - subroutine gmshModelMeshReorderElements( - & elementType, - & tag, - & ordering, - & ordering_n, - & ierr) - & bind(C, name = "gmshModelMeshReorderElements") - use, intrinsic :: iso_c_binding - integer(c_int), value::elementType - integer(c_int), value::tag - integer(c_size_t)::ordering(*) - integer(c_size_t), value :: ordering_n - integer(c_int)::ierr - end subroutine gmshModelMeshReorderElements - -! Renumber the node tags in a continuous sequence. - subroutine gmshModelMeshRenumberNodes( - & ierr) - & bind(C, name = "gmshModelMeshRenumberNodes") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshModelMeshRenumberNodes - -! Renumber the element tags in a continuous sequence. - subroutine gmshModelMeshRenumberElements( - & ierr) - & bind(C, name = "gmshModelMeshRenumberElements") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshModelMeshRenumberElements - -! Set the meshes of the entities of dimension `dim' and tag `tags' as -! periodic copies of the meshes of entities `tagsMaster', using the affine -! transformation specified in `affineTransformation' (16 entries of a 4x4 -! matrix, by row). If used after meshing, generate the periodic node -! correspondence information assuming the meshes of entities `tags' -! effectively match the meshes of entities `tagsMaster' (useful for -! structured and extruded meshes). Currently only available for @code{dim} == -! 1 and @code{dim} == 2. - subroutine gmshModelMeshSetPeriodic( - & dim, - & tags, - & tags_n, - & tagsMaster, - & tagsMaster_n, - & affineTransform, - & affineTransform_n, - & ierr) - & bind(C, name = "gmshModelMeshSetPeriodic") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int)::tags(*) - integer(c_size_t), value :: tags_n - integer(c_int)::tagsMaster(*) - integer(c_size_t), value :: tagsMaster_n - real(c_double)::affineTransform(*) - integer(c_size_t), value :: affineTransform_n - integer(c_int)::ierr - end subroutine gmshModelMeshSetPeriodic - -! Get master entities `tagsMaster' for the entities of dimension `dim' and -! tags `tags'. - subroutine gmshModelMeshGetPeriodic( - & dim, - & tags, - & tags_n, - & tagMaster, - & tagMaster_n, - & ierr) - & bind(C, name = "gmshModelMeshGetPeriodic") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int)::tags(*) - integer(c_size_t), value :: tags_n - type(c_ptr), intent(out)::tagMaster - integer(c_size_t) :: tagMaster_n - integer(c_int)::ierr - end subroutine gmshModelMeshGetPeriodic - -! Get the master entity `tagMaster', the node tags `nodeTags' and their -! corresponding master node tags `nodeTagsMaster', and the affine transform -! `affineTransform' for the entity of dimension `dim' and tag `tag'. If -! `includeHighOrderNodes' is set, include high-order nodes in the returned -! data. - subroutine gmshModelMeshGetPeriodicNodes( - & dim, - & tag, - & tagMaster, - & nodeTags, - & nodeTags_n, - & nodeTagsMaster, - & nodeTagsMaster_n, - & affineTransform, - & affineTransform_n, - & includeHighOrderNodes, - & ierr) - & bind(C, name = "gmshModelMeshGetPeriodicNodes") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int)::tagMaster - type(c_ptr), intent(out)::nodeTags - integer(c_size_t) :: nodeTags_n - type(c_ptr), intent(out)::nodeTagsMaster - integer(c_size_t) :: nodeTagsMaster_n - type(c_ptr), intent(out)::affineTransform - integer(c_size_t) :: affineTransform_n - integer(c_int), value::includeHighOrderNodes - integer(c_int)::ierr - end subroutine gmshModelMeshGetPeriodicNodes - -! Get the master entity `tagMaster' and the key pairs (`typeKeyMaster', -! `entityKeyMaster') corresponding to the entity `tag' and the key pairs -! (`typeKey', `entityKey') for the elements of type `elementType' and -! function space type `functionSpaceType'. If `returnCoord' is set, the -! `coord' and `coordMaster' vectors contain the x, y, z coordinates locating -! basis functions for sorting purposes. - subroutine gmshModelMeshGetPeriodicKeys( - & elementType, - & functionSpaceType, - & tag, - & tagMaster, - & typeKeys, - & typeKeys_n, - & typeKeysMaster, - & typeKeysMaster_n, - & entityKeys, - & entityKeys_n, - & entityKeysMaster, - & entityKeysMaster_n, - & coord, - & coord_n, - & coordMaster, - & coordMaster_n, - & returnCoord, - & ierr) - & bind(C, name = "gmshModelMeshGetPeriodicKeys") - use, intrinsic :: iso_c_binding - integer(c_int), value::elementType - character(len = 1, kind = c_char)::functionSpaceType(*) - integer(c_int), value::tag - integer(c_int)::tagMaster - type(c_ptr), intent(out)::typeKeys - integer(c_size_t) :: typeKeys_n - type(c_ptr), intent(out)::typeKeysMaster - integer(c_size_t) :: typeKeysMaster_n - type(c_ptr), intent(out)::entityKeys - integer(c_size_t) :: entityKeys_n - type(c_ptr), intent(out)::entityKeysMaster - integer(c_size_t) :: entityKeysMaster_n - type(c_ptr), intent(out)::coord - integer(c_size_t) :: coord_n - type(c_ptr), intent(out)::coordMaster - integer(c_size_t) :: coordMaster_n - integer(c_int), value::returnCoord - integer(c_int)::ierr - end subroutine gmshModelMeshGetPeriodicKeys - -! Import the model STL representation (if available) as the current mesh. - subroutine gmshModelMeshImportStl( - & ierr) - & bind(C, name = "gmshModelMeshImportStl") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshModelMeshImportStl - -! Get the `tags' of any duplicate nodes in the mesh of the entities -! `dimTags'. If `dimTags' is empty, consider the whole mesh. - subroutine gmshModelMeshGetDuplicateNodes( - & tags, - & tags_n, - & dimTags, - & dimTags_n, - & ierr) - & bind(C, name = "gmshModelMeshGetDuplicateNodes") - use, intrinsic :: iso_c_binding - type(c_ptr), intent(out)::tags - integer(c_size_t) :: tags_n - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int)::ierr - end subroutine gmshModelMeshGetDuplicateNodes - -! Remove duplicate nodes in the mesh of the entities `dimTags'. If `dimTags' -! is empty, consider the whole mesh. - subroutine gmshModelMeshRemoveDuplicateNodes( - & dimTags, - & dimTags_n, - & ierr) - & bind(C, name = "gmshModelMeshRemoveDuplicateNodes") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int)::ierr - end subroutine gmshModelMeshRemoveDuplicateNodes - -! Remove duplicate elements (defined by the same nodes, in the same entity) -! in the mesh of the entities `dimTags'. If `dimTags' is empty, consider the -! whole mesh. - subroutine gmshModelMeshRemoveDuplicateElements( - & dimTags, - & dimTags_n, - & ierr) - & bind(C, name = "gmshModelMeshRemoveDuplicateElements") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int)::ierr - end subroutine gmshModelMeshRemoveDuplicateElements - -! Split (into two triangles) all quadrangles in surface `tag' whose quality -! is lower than `quality'. If `tag' < 0, split quadrangles in all surfaces. - subroutine gmshModelMeshSplitQuadrangles( - & quality, - & tag, - & ierr) - & bind(C, name = "gmshModelMeshSplitQuadrangles") - use, intrinsic :: iso_c_binding - real(c_double), value::quality - integer(c_int), value::tag - integer(c_int)::ierr - end subroutine gmshModelMeshSplitQuadrangles - -! Set the visibility of the elements of tags `elementTags' to `value'. - subroutine gmshModelMeshSetVisibility( - & elementTags, - & elementTags_n, - & value, - & ierr) - & bind(C, name = "gmshModelMeshSetVisibility") - use, intrinsic :: iso_c_binding - integer(c_size_t)::elementTags(*) - integer(c_size_t), value :: elementTags_n - integer(c_int), value::value - integer(c_int)::ierr - end subroutine gmshModelMeshSetVisibility - -! Classify ("color") the surface mesh based on the angle threshold `angle' -! (in radians), and create new discrete surfaces, curves and points -! accordingly. If `boundary' is set, also create discrete curves on the -! boundary if the surface is open. If `forReparametrization' is set, create -! curves and surfaces that can be reparametrized using a single map. If -! `curveAngle' is less than Pi, also force curves to be split according to -! `curveAngle'. If `exportDiscrete' is set, clear any built-in CAD kernel -! entities and export the discrete entities in the built-in CAD kernel. - subroutine gmshModelMeshClassifySurfaces( - & angle, - & boundary, - & forReparametrization, - & curveAngle, - & exportDiscrete, - & ierr) - & bind(C, name = "gmshModelMeshClassifySurfaces") - use, intrinsic :: iso_c_binding - real(c_double), value::angle - integer(c_int), value::boundary - integer(c_int), value::forReparametrization - real(c_double), value::curveAngle - integer(c_int), value::exportDiscrete - integer(c_int)::ierr - end subroutine gmshModelMeshClassifySurfaces - -! Create a geometry for the discrete entities `dimTags' (represented solely -! by a mesh, without an underlying CAD description), i.e. create a -! parametrization for discrete curves and surfaces, assuming that each can be -! parametrized with a single map. If `dimTags' is empty, create a geometry -! for all the discrete entities. - subroutine gmshModelMeshCreateGeometry( - & dimTags, - & dimTags_n, - & ierr) - & bind(C, name = "gmshModelMeshCreateGeometry") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int)::ierr - end subroutine gmshModelMeshCreateGeometry - -! Create a boundary representation from the mesh if the model does not have -! one (e.g. when imported from mesh file formats with no BRep representation -! of the underlying model). If `makeSimplyConnected' is set, enforce simply -! connected discrete surfaces and volumes. If `exportDiscrete' is set, clear -! any built-in CAD kernel entities and export the discrete entities in the -! built-in CAD kernel. - subroutine gmshModelMeshCreateTopology( - & makeSimplyConnected, - & exportDiscrete, - & ierr) - & bind(C, name = "gmshModelMeshCreateTopology") - use, intrinsic :: iso_c_binding - integer(c_int), value::makeSimplyConnected - integer(c_int), value::exportDiscrete - integer(c_int)::ierr - end subroutine gmshModelMeshCreateTopology - -! Add a request to compute a basis representation for homology spaces (if -! `type' == "Homology") or cohomology spaces (if `type' == "Cohomology"). The -! computation domain is given in a list of physical group tags `domainTags'; -! if empty, the whole mesh is the domain. The computation subdomain for -! relative (co)homology computation is given in a list of physical group tags -! `subdomainTags'; if empty, absolute (co)homology is computed. The -! dimensions of the (co)homology bases to be computed are given in the list -! `dim'; if empty, all bases are computed. Resulting basis representation -! (co)chains are stored as physical groups in the mesh. If the request is -! added before mesh generation, the computation will be performed at the end -! of the meshing pipeline. - subroutine gmshModelMeshAddHomologyRequest( - & type, - & domainTags, - & domainTags_n, - & subdomainTags, - & subdomainTags_n, - & dims, - & dims_n, - & ierr) - & bind(C, name = "gmshModelMeshAddHomologyRequest") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::type(*) - integer(c_int)::domainTags(*) - integer(c_size_t), value :: domainTags_n - integer(c_int)::subdomainTags(*) - integer(c_size_t), value :: subdomainTags_n - integer(c_int)::dims(*) - integer(c_size_t), value :: dims_n - integer(c_int)::ierr - end subroutine gmshModelMeshAddHomologyRequest - -! Clear all (co)homology computation requests. - subroutine gmshModelMeshClearHomologyRequests( - & ierr) - & bind(C, name = "gmshModelMeshClearHomologyRequests") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshModelMeshClearHomologyRequests - -! Perform the (co)homology computations requested by addHomologyRequest(). - subroutine gmshModelMeshComputeHomology( - & ierr) - & bind(C, name = "gmshModelMeshComputeHomology") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshModelMeshComputeHomology - -! Compute a cross field for the current mesh. The function creates 3 views: -! the H function, the Theta function and cross directions. Return the tags of -! the views. - subroutine gmshModelMeshComputeCrossField( - & viewTags, - & viewTags_n, - & ierr) - & bind(C, name = "gmshModelMeshComputeCrossField") - use, intrinsic :: iso_c_binding - type(c_ptr), intent(out)::viewTags - integer(c_size_t) :: viewTags_n - integer(c_int)::ierr - end subroutine gmshModelMeshComputeCrossField - -! Triangulate the points given in the `coord' vector as pairs of u, v -! coordinates, and return the node tags (with numbering starting at 1) of the -! resulting triangles in `tri'. - subroutine gmshModelMeshTriangulate( - & coord, - & coord_n, - & tri, - & tri_n, - & ierr) - & bind(C, name = "gmshModelMeshTriangulate") - use, intrinsic :: iso_c_binding - real(c_double)::coord(*) - integer(c_size_t), value :: coord_n - type(c_ptr), intent(out)::tri - integer(c_size_t) :: tri_n - integer(c_int)::ierr - end subroutine gmshModelMeshTriangulate - -! Tetrahedralize the points given in the `coord' vector as triplets of x, y, -! z coordinates, and return the node tags (with numbering starting at 1) of -! the resulting tetrahedra in `tetra'. - subroutine gmshModelMeshTetrahedralize( - & coord, - & coord_n, - & tetra, - & tetra_n, - & ierr) - & bind(C, name = "gmshModelMeshTetrahedralize") - use, intrinsic :: iso_c_binding - real(c_double)::coord(*) - integer(c_size_t), value :: coord_n - type(c_ptr), intent(out)::tetra - integer(c_size_t) :: tetra_n - integer(c_int)::ierr - end subroutine gmshModelMeshTetrahedralize - -! Add a new mesh size field of type `fieldType'. If `tag' is positive, assign -! the tag explicitly; otherwise a new tag is assigned automatically. Return -! the field tag. - function gmshModelMeshFieldAdd( - & fieldType, - & tag, - & ierr) - & bind(C, name = "gmshModelMeshFieldAdd") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelMeshFieldAdd - character(len = 1, kind = c_char)::fieldType(*) - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelMeshFieldAdd - -! Remove the field with tag `tag'. - subroutine gmshModelMeshFieldRemove( - & tag, - & ierr) - & bind(C, name = "gmshModelMeshFieldRemove") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - integer(c_int)::ierr - end subroutine gmshModelMeshFieldRemove - -! Get the list of all fields. - subroutine gmshModelMeshFieldList( - & tags, - & tags_n, - & ierr) - & bind(C, name = "gmshModelMeshFieldList") - use, intrinsic :: iso_c_binding - type(c_ptr), intent(out)::tags - integer(c_size_t) :: tags_n - integer(c_int)::ierr - end subroutine gmshModelMeshFieldList - -! Get the type `fieldType' of the field with tag `tag'. - subroutine gmshModelMeshFieldGetType( - & tag, - & fileType, - & ierr) - & bind(C, name = "gmshModelMeshFieldGetType") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - type(c_ptr)::fileType(*) - integer(c_int)::ierr - end subroutine gmshModelMeshFieldGetType - -! Set the numerical option `option' to value `value' for field `tag'. - subroutine gmshModelMeshFieldSetNumber( - & tag, - & option, - & value, - & ierr) - & bind(C, name = "gmshModelMeshFieldSetNumber") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - character(len = 1, kind = c_char)::option(*) - real(c_double), value::value - integer(c_int)::ierr - end subroutine gmshModelMeshFieldSetNumber - -! Get the value of the numerical option `option' for field `tag'. - subroutine gmshModelMeshFieldGetNumber( - & tag, - & option, - & value, - & ierr) - & bind(C, name = "gmshModelMeshFieldGetNumber") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - character(len = 1, kind = c_char)::option(*) - real(c_double)::value - integer(c_int)::ierr - end subroutine gmshModelMeshFieldGetNumber - -! Set the string option `option' to value `value' for field `tag'. - subroutine gmshModelMeshFieldSetString( - & tag, - & option, - & value, - & ierr) - & bind(C, name = "gmshModelMeshFieldSetString") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - character(len = 1, kind = c_char)::option(*) - character(len = 1, kind = c_char)::value(*) - integer(c_int)::ierr - end subroutine gmshModelMeshFieldSetString - -! Get the value of the string option `option' for field `tag'. - subroutine gmshModelMeshFieldGetString( - & tag, - & option, - & value, - & ierr) - & bind(C, name = "gmshModelMeshFieldGetString") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - character(len = 1, kind = c_char)::option(*) - type(c_ptr)::value(*) - integer(c_int)::ierr - end subroutine gmshModelMeshFieldGetString - -! Set the numerical list option `option' to value `value' for field `tag'. - subroutine gmshModelMeshFieldSetNumbers( - & tag, - & option, - & value, - & value_n, - & ierr) - & bind(C, name = "gmshModelMeshFieldSetNumbers") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - character(len = 1, kind = c_char)::option(*) - real(c_double)::value(*) - integer(c_size_t), value :: value_n - integer(c_int)::ierr - end subroutine gmshModelMeshFieldSetNumbers - -! Get the value of the numerical list option `option' for field `tag'. - subroutine gmshModelMeshFieldGetNumbers( - & tag, - & option, - & value, - & value_n, - & ierr) - & bind(C, name = "gmshModelMeshFieldGetNumbers") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - character(len = 1, kind = c_char)::option(*) - type(c_ptr), intent(out)::value - integer(c_size_t) :: value_n - integer(c_int)::ierr - end subroutine gmshModelMeshFieldGetNumbers - -! Set the field `tag' as the background mesh size field. - subroutine gmshModelMeshFieldSetAsBackgroundMesh( - & tag, - & ierr) - & bind(C, name = "gmshModelMeshFieldSetAsBackgroundMesh") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - integer(c_int)::ierr - end subroutine gmshModelMeshFieldSetAsBackgroundMesh - -! Set the field `tag' as a boundary layer size field. - subroutine gmshModelMeshFieldSetAsBoundaryLayer( - & tag, - & ierr) - & bind(C, name = "gmshModelMeshFieldSetAsBoundaryLayer") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - integer(c_int)::ierr - end subroutine gmshModelMeshFieldSetAsBoundaryLayer - -! Add a geometrical point in the built-in CAD representation, at coordinates -! (`x', `y', `z'). If `meshSize' is > 0, add a meshing constraint at that -! point. If `tag' is positive, set the tag explicitly; otherwise a new tag is -! selected automatically. Return the tag of the point. (Note that the point -! will be added in the current model only after `synchronize' is called. This -! behavior holds for all the entities added in the geo module.) - function gmshModelGeoAddPoint( - & x, - & y, - & z, - & meshSize, - & tag, - & ierr) - & bind(C, name = "gmshModelGeoAddPoint") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGeoAddPoint - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - real(c_double), value::meshSize - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelGeoAddPoint - -! Add a straight line segment in the built-in CAD representation, between the -! two points with tags `startTag' and `endTag'. If `tag' is positive, set the -! tag explicitly; otherwise a new tag is selected automatically. Return the -! tag of the line. - function gmshModelGeoAddLine( - & startTag, - & endTag, - & tag, - & ierr) - & bind(C, name = "gmshModelGeoAddLine") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGeoAddLine - integer(c_int), value::startTag - integer(c_int), value::endTag - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelGeoAddLine - -! Add a circle arc (strictly smaller than Pi) in the built-in CAD -! representation, between the two points with tags `startTag' and `endTag', -! and with center `centerTag'. If `tag' is positive, set the tag explicitly; -! otherwise a new tag is selected automatically. If (`nx', `ny', `nz') != (0, -! 0, 0), explicitly set the plane of the circle arc. Return the tag of the -! circle arc. - function gmshModelGeoAddCircleArc( - & startTag, - & centerTag, - & endTag, - & tag, - & nx, - & ny, - & nz, - & ierr) - & bind(C, name = "gmshModelGeoAddCircleArc") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGeoAddCircleArc - integer(c_int), value::startTag - integer(c_int), value::centerTag - integer(c_int), value::endTag - integer(c_int), value::tag - real(c_double), value::nx - real(c_double), value::ny - real(c_double), value::nz - integer(c_int)::ierr - end function gmshModelGeoAddCircleArc - -! Add an ellipse arc (strictly smaller than Pi) in the built-in CAD -! representation, between the two points `startTag' and `endTag', and with -! center `centerTag' and major axis point `majorTag'. If `tag' is positive, -! set the tag explicitly; otherwise a new tag is selected automatically. If -! (`nx', `ny', `nz') != (0, 0, 0), explicitly set the plane of the circle -! arc. Return the tag of the ellipse arc. - function gmshModelGeoAddEllipseArc( - & startTag, - & centerTag, - & majorTag, - & endTag, - & tag, - & nx, - & ny, - & nz, - & ierr) - & bind(C, name = "gmshModelGeoAddEllipseArc") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGeoAddEllipseArc - integer(c_int), value::startTag - integer(c_int), value::centerTag - integer(c_int), value::majorTag - integer(c_int), value::endTag - integer(c_int), value::tag - real(c_double), value::nx - real(c_double), value::ny - real(c_double), value::nz - integer(c_int)::ierr - end function gmshModelGeoAddEllipseArc - -! Add a spline (Catmull-Rom) curve in the built-in CAD representation, going -! through the points `pointTags'. If `tag' is positive, set the tag -! explicitly; otherwise a new tag is selected automatically. Create a -! periodic curve if the first and last points are the same. Return the tag of -! the spline curve. - function gmshModelGeoAddSpline( - & pointTags, - & pointTags_n, - & tag, - & ierr) - & bind(C, name = "gmshModelGeoAddSpline") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGeoAddSpline - integer(c_int)::pointTags(*) - integer(c_size_t), value :: pointTags_n - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelGeoAddSpline - -! Add a cubic b-spline curve in the built-in CAD representation, with -! `pointTags' control points. If `tag' is positive, set the tag explicitly; -! otherwise a new tag is selected automatically. Creates a periodic curve if -! the first and last points are the same. Return the tag of the b-spline -! curve. - function gmshModelGeoAddBSpline( - & pointTags, - & pointTags_n, - & tag, - & ierr) - & bind(C, name = "gmshModelGeoAddBSpline") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGeoAddBSpline - integer(c_int)::pointTags(*) - integer(c_size_t), value :: pointTags_n - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelGeoAddBSpline - -! Add a Bezier curve in the built-in CAD representation, with `pointTags' -! control points. If `tag' is positive, set the tag explicitly; otherwise a -! new tag is selected automatically. Return the tag of the Bezier curve. - function gmshModelGeoAddBezier( - & pointTags, - & pointTags_n, - & tag, - & ierr) - & bind(C, name = "gmshModelGeoAddBezier") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGeoAddBezier - integer(c_int)::pointTags(*) - integer(c_size_t), value :: pointTags_n - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelGeoAddBezier - -! Add a polyline curve in the built-in CAD representation, going through the -! points `pointTags'. If `tag' is positive, set the tag explicitly; otherwise -! a new tag is selected automatically. Create a periodic curve if the first -! and last points are the same. Return the tag of the polyline curve. - function gmshModelGeoAddPolyline( - & pointTags, - & pointTags_n, - & tag, - & ierr) - & bind(C, name = "gmshModelGeoAddPolyline") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGeoAddPolyline - integer(c_int)::pointTags(*) - integer(c_size_t), value :: pointTags_n - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelGeoAddPolyline - -! Add a spline (Catmull-Rom) curve in the built-in CAD representation, going -! through points sampling the curves in `curveTags'. The density of sampling -! points on each curve is governed by `numIntervals'. If `tag' is positive, -! set the tag explicitly; otherwise a new tag is selected automatically. -! Return the tag of the spline. - function gmshModelGeoAddCompoundSpline( - & curveTags, - & curveTags_n, - & numIntervals, - & tag, - & ierr) - & bind(C, name = "gmshModelGeoAddCompoundSpline") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGeoAddCompoundSpline - integer(c_int)::curveTags(*) - integer(c_size_t), value :: curveTags_n - integer(c_int), value::numIntervals - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelGeoAddCompoundSpline - -! Add a b-spline curve in the built-in CAD representation, with control -! points sampling the curves in `curveTags'. The density of sampling points -! on each curve is governed by `numIntervals'. If `tag' is positive, set the -! tag explicitly; otherwise a new tag is selected automatically. Return the -! tag of the b-spline. - function gmshModelGeoAddCompoundBSpline( - & curveTags, - & curveTags_n, - & numIntervals, - & tag, - & ierr) - & bind(C, name = "gmshModelGeoAddCompoundBSpline") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGeoAddCompoundBSpline - integer(c_int)::curveTags(*) - integer(c_size_t), value :: curveTags_n - integer(c_int), value::numIntervals - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelGeoAddCompoundBSpline - -! Add a curve loop (a closed wire) in the built-in CAD representation, formed -! by the curves `curveTags'. `curveTags' should contain (signed) tags of -! model entities of dimension 1 forming a closed loop: a negative tag -! signifies that the underlying curve is considered with reversed -! orientation. If `tag' is positive, set the tag explicitly; otherwise a new -! tag is selected automatically. If `reorient' is set, automatically reorient -! the curves if necessary. Return the tag of the curve loop. - function gmshModelGeoAddCurveLoop( - & curveTags, - & curveTags_n, - & tag, - & reorient, - & ierr) - & bind(C, name = "gmshModelGeoAddCurveLoop") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGeoAddCurveLoop - integer(c_int)::curveTags(*) - integer(c_size_t), value :: curveTags_n - integer(c_int), value::tag - integer(c_int), value::reorient - integer(c_int)::ierr - end function gmshModelGeoAddCurveLoop - -! Add curve loops in the built-in CAD representation based on the curves -! `curveTags'. Return the `tags' of found curve loops, if any. - subroutine gmshModelGeoAddCurveLoops( - & curveTags, - & curveTags_n, - & tags, - & tags_n, - & ierr) - & bind(C, name = "gmshModelGeoAddCurveLoops") - use, intrinsic :: iso_c_binding - integer(c_int)::curveTags(*) - integer(c_size_t), value :: curveTags_n - type(c_ptr), intent(out)::tags - integer(c_size_t) :: tags_n - integer(c_int)::ierr - end subroutine gmshModelGeoAddCurveLoops - -! Add a plane surface in the built-in CAD representation, defined by one or -! more curve loops `wireTags'. The first curve loop defines the exterior -! contour; additional curve loop define holes. If `tag' is positive, set the -! tag explicitly; otherwise a new tag is selected automatically. Return the -! tag of the surface. - function gmshModelGeoAddPlaneSurface( - & wireTags, - & wireTags_n, - & tag, - & ierr) - & bind(C, name = "gmshModelGeoAddPlaneSurface") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGeoAddPlaneSurface - integer(c_int)::wireTags(*) - integer(c_size_t), value :: wireTags_n - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelGeoAddPlaneSurface - -! Add a surface in the built-in CAD representation, filling the curve loops -! in `wireTags' using transfinite interpolation. Currently only a single -! curve loop is supported; this curve loop should be composed by 3 or 4 -! curves only. If `tag' is positive, set the tag explicitly; otherwise a new -! tag is selected automatically. Return the tag of the surface. - function gmshModelGeoAddSurfaceFilling( - & wireTags, - & wireTags_n, - & tag, - & sphereCenterTag, - & ierr) - & bind(C, name = "gmshModelGeoAddSurfaceFilling") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGeoAddSurfaceFilling - integer(c_int)::wireTags(*) - integer(c_size_t), value :: wireTags_n - integer(c_int), value::tag - integer(c_int), value::sphereCenterTag - integer(c_int)::ierr - end function gmshModelGeoAddSurfaceFilling - -! Add a surface loop (a closed shell) formed by `surfaceTags' in the built-in -! CAD representation. If `tag' is positive, set the tag explicitly; -! otherwise a new tag is selected automatically. Return the tag of the shell. - function gmshModelGeoAddSurfaceLoop( - & surfaceTags, - & surfaceTags_n, - & tag, - & ierr) - & bind(C, name = "gmshModelGeoAddSurfaceLoop") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGeoAddSurfaceLoop - integer(c_int)::surfaceTags(*) - integer(c_size_t), value :: surfaceTags_n - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelGeoAddSurfaceLoop - -! Add a volume (a region) in the built-in CAD representation, defined by one -! or more shells `shellTags'. The first surface loop defines the exterior -! boundary; additional surface loop define holes. If `tag' is positive, set -! the tag explicitly; otherwise a new tag is selected automatically. Return -! the tag of the volume. - function gmshModelGeoAddVolume( - & shellTags, - & shellTags_n, - & tag, - & ierr) - & bind(C, name = "gmshModelGeoAddVolume") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGeoAddVolume - integer(c_int)::shellTags(*) - integer(c_size_t), value :: shellTags_n - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelGeoAddVolume - -! Add a `geometry' in the built-in CAD representation. `geometry' can -! currently be one of "Sphere" or "PolarSphere" (where `numbers' should -! contain the x, y, z coordinates of the center, followed by the radius), or -! "Parametric" (where `strings' should contains three expression evaluating -! to the x, y and z coordinates. If `tag' is positive, set the tag of the -! geometry explicitly; otherwise a new tag is selected automatically. Return -! the tag of the geometry. - function gmshModelGeoAddGeometry( - & geometry, - & numbers, - & numbers_n, - & strings, - & strings_n, - & tag, - & ierr) - & bind(C, name = "gmshModelGeoAddGeometry") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGeoAddGeometry - character(len = 1, kind = c_char)::geometry(*) - real(c_double)::numbers(*) - integer(c_size_t), value :: numbers_n - type(c_ptr)::strings(*) - integer(c_size_t), value :: strings_n - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelGeoAddGeometry - -! Add a point in the built-in CAD representation, at coordinates (`x', `y', -! `z') on the geometry `geometryTag'. If `meshSize' is > 0, add a meshing -! constraint at that point. If `tag' is positive, set the tag explicitly; -! otherwise a new tag is selected automatically. Return the tag of the point. -! For surface geometries, only the `x' and `y' coordinates are used. - function gmshModelGeoAddPointOnGeometry( - & geometryTag, - & x, - & y, - & z, - & meshSize, - & tag, - & ierr) - & bind(C, name = "gmshModelGeoAddPointOnGeometry") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGeoAddPointOnGeometry - integer(c_int), value::geometryTag - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - real(c_double), value::meshSize - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelGeoAddPointOnGeometry - -! Extrude the entities `dimTags' in the built-in CAD representation, using a -! translation along (`dx', `dy', `dz'). Return extruded entities in -! `outDimTags'. If `numElements' is not empty, also extrude the mesh: the -! entries in `numElements' give the number of elements in each layer. If -! `height' is not empty, it provides the (cumulative) height of the different -! layers, normalized to 1. If `recombine' is set, recombine the mesh in the -! layers. - subroutine gmshModelGeoExtrude( - & dimTags, - & dimTags_n, - & dx, - & dy, - & dz, - & outDimTags, - & outDimTags_n, - & numElements, - & numElements_n, - & heights, - & heights_n, - & recombine, - & ierr) - & bind(C, name = "gmshModelGeoExtrude") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::dx - real(c_double), value::dy - real(c_double), value::dz - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - integer(c_int)::numElements(*) - integer(c_size_t), value :: numElements_n - real(c_double)::heights(*) - integer(c_size_t), value :: heights_n - integer(c_int), value::recombine - integer(c_int)::ierr - end subroutine gmshModelGeoExtrude - -! Extrude the entities `dimTags' in the built-in CAD representation, using a -! rotation of `angle' radians around the axis of revolution defined by the -! point (`x', `y', `z') and the direction (`ax', `ay', `az'). The angle -! should be strictly smaller than Pi. Return extruded entities in -! `outDimTags'. If `numElements' is not empty, also extrude the mesh: the -! entries in `numElements' give the number of elements in each layer. If -! `height' is not empty, it provides the (cumulative) height of the different -! layers, normalized to 1. If `recombine' is set, recombine the mesh in the -! layers. - subroutine gmshModelGeoRevolve( - & dimTags, - & dimTags_n, - & x, - & y, - & z, - & ax, - & ay, - & az, - & angle, - & outDimTags, - & outDimTags_n, - & numElements, - & numElements_n, - & heights, - & heights_n, - & recombine, - & ierr) - & bind(C, name = "gmshModelGeoRevolve") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - real(c_double), value::ax - real(c_double), value::ay - real(c_double), value::az - real(c_double), value::angle - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - integer(c_int)::numElements(*) - integer(c_size_t), value :: numElements_n - real(c_double)::heights(*) - integer(c_size_t), value :: heights_n - integer(c_int), value::recombine - integer(c_int)::ierr - end subroutine gmshModelGeoRevolve - -! Extrude the entities `dimTags' in the built-in CAD representation, using a -! combined translation and rotation of `angle' radians, along (`dx', `dy', -! `dz') and around the axis of revolution defined by the point (`x', `y', -! `z') and the direction (`ax', `ay', `az'). The angle should be strictly -! smaller than Pi. Return extruded entities in `outDimTags'. If `numElements' -! is not empty, also extrude the mesh: the entries in `numElements' give the -! number of elements in each layer. If `height' is not empty, it provides the -! (cumulative) height of the different layers, normalized to 1. If -! `recombine' is set, recombine the mesh in the layers. - subroutine gmshModelGeoTwist( - & dimTags, - & dimTags_n, - & x, - & y, - & z, - & dx, - & dy, - & dz, - & ax, - & ay, - & az, - & angle, - & outDimTags, - & outDimTags_n, - & numElements, - & numElements_n, - & heights, - & heights_n, - & recombine, - & ierr) - & bind(C, name = "gmshModelGeoTwist") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - real(c_double), value::dx - real(c_double), value::dy - real(c_double), value::dz - real(c_double), value::ax - real(c_double), value::ay - real(c_double), value::az - real(c_double), value::angle - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - integer(c_int)::numElements(*) - integer(c_size_t), value :: numElements_n - real(c_double)::heights(*) - integer(c_size_t), value :: heights_n - integer(c_int), value::recombine - integer(c_int)::ierr - end subroutine gmshModelGeoTwist - -! Extrude the entities `dimTags' in the built-in CAD representation along the -! normals of the mesh, creating discrete boundary layer entities. Return -! extruded entities in `outDimTags'. The entries in `numElements' give the -! number of elements in each layer. If `height' is not empty, it provides the -! (cumulative) height of the different layers. If `recombine' is set, -! recombine the mesh in the layers. A second boundary layer can be created -! from the same entities if `second' is set. If `viewIndex' is >= 0, use the -! corresponding view to either specify the normals (if the view contains a -! vector field) or scale the normals (if the view is scalar). - subroutine gmshModelGeoExtrudeBoundaryLayer( - & dimTags, - & dimTags_n, - & outDimTags, - & outDimTags_n, - & numElements, - & numElements_n, - & heights, - & heights_n, - & recombine, - & second, - & viewIndex, - & ierr) - & bind(C, name = "gmshModelGeoExtrudeBoundaryLayer") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - integer(c_int)::numElements(*) - integer(c_size_t), value :: numElements_n - real(c_double)::heights(*) - integer(c_size_t), value :: heights_n - integer(c_int), value::recombine - integer(c_int), value::second - integer(c_int), value::viewIndex - integer(c_int)::ierr - end subroutine gmshModelGeoExtrudeBoundaryLayer - -! Translate the entities `dimTags' in the built-in CAD representation along -! (`dx', `dy', `dz'). - subroutine gmshModelGeoTranslate( - & dimTags, - & dimTags_n, - & dx, - & dy, - & dz, - & ierr) - & bind(C, name = "gmshModelGeoTranslate") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::dx - real(c_double), value::dy - real(c_double), value::dz - integer(c_int)::ierr - end subroutine gmshModelGeoTranslate - -! Rotate the entities `dimTags' in the built-in CAD representation by `angle' -! radians around the axis of revolution defined by the point (`x', `y', `z') -! and the direction (`ax', `ay', `az'). - subroutine gmshModelGeoRotate( - & dimTags, - & dimTags_n, - & x, - & y, - & z, - & ax, - & ay, - & az, - & angle, - & ierr) - & bind(C, name = "gmshModelGeoRotate") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - real(c_double), value::ax - real(c_double), value::ay - real(c_double), value::az - real(c_double), value::angle - integer(c_int)::ierr - end subroutine gmshModelGeoRotate - -! Scale the entities `dimTag' in the built-in CAD representation by factors -! `a', `b' and `c' along the three coordinate axes; use (`x', `y', `z') as -! the center of the homothetic transformation. - subroutine gmshModelGeoDilate( - & dimTags, - & dimTags_n, - & x, - & y, - & z, - & a, - & b, - & c, - & ierr) - & bind(C, name = "gmshModelGeoDilate") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - real(c_double), value::a - real(c_double), value::b - real(c_double), value::c - integer(c_int)::ierr - end subroutine gmshModelGeoDilate - -! Mirror the entities `dimTag' in the built-in CAD representation, with -! respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0. - subroutine gmshModelGeoMirror( - & dimTags, - & dimTags_n, - & a, - & b, - & c, - & d, - & ierr) - & bind(C, name = "gmshModelGeoMirror") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::a - real(c_double), value::b - real(c_double), value::c - real(c_double), value::d - integer(c_int)::ierr - end subroutine gmshModelGeoMirror - -! Mirror the entities `dimTag' in the built-in CAD representation, with -! respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0. -! (This is a synonym for `mirror', which will be deprecated in a future -! release.) - subroutine gmshModelGeoSymmetrize( - & dimTags, - & dimTags_n, - & a, - & b, - & c, - & d, - & ierr) - & bind(C, name = "gmshModelGeoSymmetrize") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::a - real(c_double), value::b - real(c_double), value::c - real(c_double), value::d - integer(c_int)::ierr - end subroutine gmshModelGeoSymmetrize - -! Copy the entities `dimTags' in the built-in CAD representation; the new -! entities are returned in `outDimTags'. - subroutine gmshModelGeoCopy( - & dimTags, - & dimTags_n, - & outDimTags, - & outDimTags_n, - & ierr) - & bind(C, name = "gmshModelGeoCopy") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - integer(c_int)::ierr - end subroutine gmshModelGeoCopy - -! Remove the entities `dimTags' in the built-in CAD representation, provided -! that they are not on the boundary of higher-dimensional entities. If -! `recursive' is true, remove all the entities on their boundaries, down to -! dimension 0. - subroutine gmshModelGeoRemove( - & dimTags, - & dimTags_n, - & recursive, - & ierr) - & bind(C, name = "gmshModelGeoRemove") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int), value::recursive - integer(c_int)::ierr - end subroutine gmshModelGeoRemove - -! Remove all duplicate entities in the built-in CAD representation (different -! entities at the same geometrical location). - subroutine gmshModelGeoRemoveAllDuplicates( - & ierr) - & bind(C, name = "gmshModelGeoRemoveAllDuplicates") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshModelGeoRemoveAllDuplicates - -! Split the curve of tag `tag' in the built-in CAD representation, on the -! specified control points `pointTags'. This feature is only available for -! lines, splines and b-splines. Return the tag(s) `curveTags' of the newly -! created curve(s). - subroutine gmshModelGeoSplitCurve( - & tag, - & pointTags, - & pointTags_n, - & curveTags, - & curveTags_n, - & ierr) - & bind(C, name = "gmshModelGeoSplitCurve") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - integer(c_int)::pointTags(*) - integer(c_size_t), value :: pointTags_n - type(c_ptr), intent(out)::curveTags - integer(c_size_t) :: curveTags_n - integer(c_int)::ierr - end subroutine gmshModelGeoSplitCurve - -! Get the maximum tag of entities of dimension `dim' in the built-in CAD -! representation. - function gmshModelGeoGetMaxTag( - & dim, - & ierr) - & bind(C, name = "gmshModelGeoGetMaxTag") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGeoGetMaxTag - integer(c_int), value::dim - integer(c_int)::ierr - end function gmshModelGeoGetMaxTag - -! Set the maximum tag `maxTag' for entities of dimension `dim' in the built- -! in CAD representation. - subroutine gmshModelGeoSetMaxTag( - & dim, - & maxTag, - & ierr) - & bind(C, name = "gmshModelGeoSetMaxTag") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::maxTag - integer(c_int)::ierr - end subroutine gmshModelGeoSetMaxTag - -! Add a physical group of dimension `dim', grouping the entities with tags -! `tags' in the built-in CAD representation. Return the tag of the physical -! group, equal to `tag' if `tag' is positive, or a new tag if `tag' < 0. Set -! the name of the physical group if `name' is not empty. - function gmshModelGeoAddPhysicalGroup( - & dim, - & tags, - & tags_n, - & tag, - & name, - & ierr) - & bind(C, name = "gmshModelGeoAddPhysicalGroup") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelGeoAddPhysicalGroup - integer(c_int), value::dim - integer(c_int)::tags(*) - integer(c_size_t), value :: tags_n - integer(c_int), value::tag - character(len = 1, kind = c_char)::name(*) - integer(c_int)::ierr - end function gmshModelGeoAddPhysicalGroup - -! Remove the physical groups `dimTags' from the built-in CAD representation. -! If `dimTags' is empty, remove all groups. - subroutine gmshModelGeoRemovePhysicalGroups( - & dimTags, - & dimTags_n, - & ierr) - & bind(C, name = "gmshModelGeoRemovePhysicalGroups") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int)::ierr - end subroutine gmshModelGeoRemovePhysicalGroups - -! Synchronize the built-in CAD representation with the current Gmsh model. -! This can be called at any time, but since it involves a non trivial amount -! of processing, the number of synchronization points should normally be -! minimized. Without synchronization the entities in the built-in CAD -! representation are not available to any function outside of the built-in -! CAD kernel functions. - subroutine gmshModelGeoSynchronize( - & ierr) - & bind(C, name = "gmshModelGeoSynchronize") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshModelGeoSynchronize - -! Set a mesh size constraint on the entities `dimTags' in the built-in CAD -! kernel representation. Currently only entities of dimension 0 (points) are -! handled. - subroutine gmshModelGeoMeshSetSize( - & dimTags, - & dimTags_n, - & size, - & ierr) - & bind(C, name = "gmshModelGeoMeshSetSize") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::size - integer(c_int)::ierr - end subroutine gmshModelGeoMeshSetSize - -! Set a transfinite meshing constraint on the curve `tag' in the built-in CAD -! kernel representation, with `numNodes' nodes distributed according to -! `meshType' and `coef'. Currently supported types are "Progression" -! (geometrical progression with power `coef') and "Bump" (refinement toward -! both extremities of the curve). - subroutine gmshModelGeoMeshSetTransfiniteCurve( - & tag, - & nPoints, - & meshType, - & coef, - & ierr) - & bind(C, name = "gmshModelGeoMeshSetTransfiniteCurve") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - integer(c_int), value::nPoints - character(len = 1, kind = c_char)::meshType(*) - real(c_double), value::coef - integer(c_int)::ierr - end subroutine gmshModelGeoMeshSetTransfiniteCurve - -! Set a transfinite meshing constraint on the surface `tag' in the built-in -! CAD kernel representation. `arrangement' describes the arrangement of the -! triangles when the surface is not flagged as recombined: currently -! supported values are "Left", "Right", "AlternateLeft" and "AlternateRight". -! `cornerTags' can be used to specify the (3 or 4) corners of the transfinite -! interpolation explicitly; specifying the corners explicitly is mandatory if -! the surface has more that 3 or 4 points on its boundary. - subroutine gmshModelGeoMeshSetTransfiniteSurface( - & tag, - & arrangement, - & cornerTags, - & cornerTags_n, - & ierr) - & bind(C, name = "gmshModelGeoMeshSetTransfiniteSurface") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - character(len = 1, kind = c_char)::arrangement(*) - integer(c_int)::cornerTags(*) - integer(c_size_t), value :: cornerTags_n - integer(c_int)::ierr - end subroutine gmshModelGeoMeshSetTransfiniteSurface - -! Set a transfinite meshing constraint on the surface `tag' in the built-in -! CAD kernel representation. `cornerTags' can be used to specify the (6 or 8) -! corners of the transfinite interpolation explicitly. - subroutine gmshModelGeoMeshSetTransfiniteVolume( - & tag, - & cornerTags, - & cornerTags_n, - & ierr) - & bind(C, name = "gmshModelGeoMeshSetTransfiniteVolume") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - integer(c_int)::cornerTags(*) - integer(c_size_t), value :: cornerTags_n - integer(c_int)::ierr - end subroutine gmshModelGeoMeshSetTransfiniteVolume - -! Set a recombination meshing constraint on the entity of dimension `dim' and -! tag `tag' in the built-in CAD kernel representation. Currently only -! entities of dimension 2 (to recombine triangles into quadrangles) are -! supported; `angle' specifies the threshold angle for the simple -! recombination algorithm. - subroutine gmshModelGeoMeshSetRecombine( - & dim, - & tag, - & angle, - & ierr) - & bind(C, name = "gmshModelGeoMeshSetRecombine") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - real(c_double), value::angle - integer(c_int)::ierr - end subroutine gmshModelGeoMeshSetRecombine - -! Set a smoothing meshing constraint on the entity of dimension `dim' and tag -! `tag' in the built-in CAD kernel representation. `val' iterations of a -! Laplace smoother are applied. - subroutine gmshModelGeoMeshSetSmoothing( - & dim, - & tag, - & val, - & ierr) - & bind(C, name = "gmshModelGeoMeshSetSmoothing") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int), value::val - integer(c_int)::ierr - end subroutine gmshModelGeoMeshSetSmoothing - -! Set a reverse meshing constraint on the entity of dimension `dim' and tag -! `tag' in the built-in CAD kernel representation. If `val' is true, the mesh -! orientation will be reversed with respect to the natural mesh orientation -! (i.e. the orientation consistent with the orientation of the geometry). If -! `val' is false, the mesh is left as-is. - subroutine gmshModelGeoMeshSetReverse( - & dim, - & tag, - & val, - & ierr) - & bind(C, name = "gmshModelGeoMeshSetReverse") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int), value::val - integer(c_int)::ierr - end subroutine gmshModelGeoMeshSetReverse - -! Set the meshing algorithm on the entity of dimension `dim' and tag `tag' in -! the built-in CAD kernel representation. Currently only supported for `dim' -! == 2. - subroutine gmshModelGeoMeshSetAlgorithm( - & dim, - & tag, - & val, - & ierr) - & bind(C, name = "gmshModelGeoMeshSetAlgorithm") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int), value::val - integer(c_int)::ierr - end subroutine gmshModelGeoMeshSetAlgorithm - -! Force the mesh size to be extended from the boundary, or not, for the -! entity of dimension `dim' and tag `tag' in the built-in CAD kernel -! representation. Currently only supported for `dim' == 2. - subroutine gmshModelGeoMeshSetSizeFromBoundary( - & dim, - & tag, - & val, - & ierr) - & bind(C, name = "gmshModelGeoMeshSetSizeFromBoundary") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int), value::val - integer(c_int)::ierr - end subroutine gmshModelGeoMeshSetSizeFromBoundary - -! Add a geometrical point in the OpenCASCADE CAD representation, at -! coordinates (`x', `y', `z'). If `meshSize' is > 0, add a meshing constraint -! at that point. If `tag' is positive, set the tag explicitly; otherwise a -! new tag is selected automatically. Return the tag of the point. (Note that -! the point will be added in the current model only after `synchronize' is -! called. This behavior holds for all the entities added in the occ module.) - function gmshModelOccAddPoint( - & x, - & y, - & z, - & meshSize, - & tag, - & ierr) - & bind(C, name = "gmshModelOccAddPoint") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddPoint - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - real(c_double), value::meshSize - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelOccAddPoint - -! Add a straight line segment in the OpenCASCADE CAD representation, between -! the two points with tags `startTag' and `endTag'. If `tag' is positive, set -! the tag explicitly; otherwise a new tag is selected automatically. Return -! the tag of the line. - function gmshModelOccAddLine( - & startTag, - & endTag, - & tag, - & ierr) - & bind(C, name = "gmshModelOccAddLine") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddLine - integer(c_int), value::startTag - integer(c_int), value::endTag - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelOccAddLine - -! Add a circle arc in the OpenCASCADE CAD representation, between the two -! points with tags `startTag' and `endTag', with center `centerTag'. If `tag' -! is positive, set the tag explicitly; otherwise a new tag is selected -! automatically. Return the tag of the circle arc. - function gmshModelOccAddCircleArc( - & startTag, - & centerTag, - & endTag, - & tag, - & ierr) - & bind(C, name = "gmshModelOccAddCircleArc") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddCircleArc - integer(c_int), value::startTag - integer(c_int), value::centerTag - integer(c_int), value::endTag - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelOccAddCircleArc - -! Add a circle of center (`x', `y', `z') and radius `r' in the OpenCASCADE -! CAD representation. If `tag' is positive, set the tag explicitly; otherwise -! a new tag is selected automatically. If `angle1' and `angle2' are -! specified, create a circle arc between the two angles. If a vector `zAxis' -! of size 3 is provided, use it as the normal to the circle plane (z-axis). -! If a vector `xAxis' of size 3 is provided in addition to `zAxis', use it to -! define the x-axis. Return the tag of the circle. - function gmshModelOccAddCircle( - & x, - & y, - & z, - & r, - & tag, - & angle1, - & angle2, - & zAxis, - & zAxis_n, - & xAxis, - & xAxis_n, - & ierr) - & bind(C, name = "gmshModelOccAddCircle") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddCircle - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - real(c_double), value::r - integer(c_int), value::tag - real(c_double), value::angle1 - real(c_double), value::angle2 - real(c_double)::zAxis(*) - integer(c_size_t), value :: zAxis_n - real(c_double)::xAxis(*) - integer(c_size_t), value :: xAxis_n - integer(c_int)::ierr - end function gmshModelOccAddCircle - -! Add an ellipse arc in the OpenCASCADE CAD representation, between the two -! points `startTag' and `endTag', and with center `centerTag' and major axis -! point `majorTag'. If `tag' is positive, set the tag explicitly; otherwise a -! new tag is selected automatically. Return the tag of the ellipse arc. Note -! that OpenCASCADE does not allow creating ellipse arcs with the major radius -! smaller than the minor radius. - function gmshModelOccAddEllipseArc( - & startTag, - & centerTag, - & majorTag, - & endTag, - & tag, - & ierr) - & bind(C, name = "gmshModelOccAddEllipseArc") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddEllipseArc - integer(c_int), value::startTag - integer(c_int), value::centerTag - integer(c_int), value::majorTag - integer(c_int), value::endTag - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelOccAddEllipseArc - -! Add an ellipse of center (`x', `y', `z') and radii `r1' and `r2' (with `r1' -! >= `r2') along the x- and y-axes, respectively, in the OpenCASCADE CAD -! representation. If `tag' is positive, set the tag explicitly; otherwise a -! new tag is selected automatically. If `angle1' and `angle2' are specified, -! create an ellipse arc between the two angles. If a vector `zAxis' of size 3 -! is provided, use it as the normal to the ellipse plane (z-axis). If a -! vector `xAxis' of size 3 is provided in addition to `zAxis', use it to -! define the x-axis. Return the tag of the ellipse. - function gmshModelOccAddEllipse( - & x, - & y, - & z, - & r1, - & r2, - & tag, - & angle1, - & angle2, - & zAxis, - & zAxis_n, - & xAxis, - & xAxis_n, - & ierr) - & bind(C, name = "gmshModelOccAddEllipse") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddEllipse - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - real(c_double), value::r1 - real(c_double), value::r2 - integer(c_int), value::tag - real(c_double), value::angle1 - real(c_double), value::angle2 - real(c_double)::zAxis(*) - integer(c_size_t), value :: zAxis_n - real(c_double)::xAxis(*) - integer(c_size_t), value :: xAxis_n - integer(c_int)::ierr - end function gmshModelOccAddEllipse - -! Add a spline (C2 b-spline) curve in the OpenCASCADE CAD representation, -! going through the points `pointTags'. If `tag' is positive, set the tag -! explicitly; otherwise a new tag is selected automatically. Create a -! periodic curve if the first and last points are the same. Return the tag of -! the spline curve. - function gmshModelOccAddSpline( - & pointTags, - & pointTags_n, - & tag, - & ierr) - & bind(C, name = "gmshModelOccAddSpline") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddSpline - integer(c_int)::pointTags(*) - integer(c_size_t), value :: pointTags_n - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelOccAddSpline - -! Add a b-spline curve of degree `degree' in the OpenCASCADE CAD -! representation, with `pointTags' control points. If `weights', `knots' or -! `multiplicities' are not provided, default parameters are computed -! automatically. If `tag' is positive, set the tag explicitly; otherwise a -! new tag is selected automatically. Create a periodic curve if the first and -! last points are the same. Return the tag of the b-spline curve. - function gmshModelOccAddBSpline( - & pointTags, - & pointTags_n, - & tag, - & degree, - & weights, - & weights_n, - & knots, - & knots_n, - & multiplicities, - & multiplicities_n, - & ierr) - & bind(C, name = "gmshModelOccAddBSpline") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddBSpline - integer(c_int)::pointTags(*) - integer(c_size_t), value :: pointTags_n - integer(c_int), value::tag - integer(c_int), value::degree - real(c_double)::weights(*) - integer(c_size_t), value :: weights_n - real(c_double)::knots(*) - integer(c_size_t), value :: knots_n - integer(c_int)::multiplicities(*) - integer(c_size_t), value :: multiplicities_n - integer(c_int)::ierr - end function gmshModelOccAddBSpline - -! Add a Bezier curve in the OpenCASCADE CAD representation, with `pointTags' -! control points. If `tag' is positive, set the tag explicitly; otherwise a -! new tag is selected automatically. Return the tag of the Bezier curve. - function gmshModelOccAddBezier( - & pointTags, - & pointTags_n, - & tag, - & ierr) - & bind(C, name = "gmshModelOccAddBezier") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddBezier - integer(c_int)::pointTags(*) - integer(c_size_t), value :: pointTags_n - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelOccAddBezier - -! Add a wire (open or closed) in the OpenCASCADE CAD representation, formed -! by the curves `curveTags'. Note that an OpenCASCADE wire can be made of -! curves that share geometrically identical (but topologically different) -! points. If `tag' is positive, set the tag explicitly; otherwise a new tag -! is selected automatically. Return the tag of the wire. - function gmshModelOccAddWire( - & curveTags, - & curveTags_n, - & tag, - & checkClosed, - & ierr) - & bind(C, name = "gmshModelOccAddWire") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddWire - integer(c_int)::curveTags(*) - integer(c_size_t), value :: curveTags_n - integer(c_int), value::tag - integer(c_int), value::checkClosed - integer(c_int)::ierr - end function gmshModelOccAddWire - -! Add a curve loop (a closed wire) in the OpenCASCADE CAD representation, -! formed by the curves `curveTags'. `curveTags' should contain tags of curves -! forming a closed loop. Negative tags can be specified for compatibility -! with the built-in kernel, but are simply ignored: the wire is oriented -! according to the orientation of its first curve. Note that an OpenCASCADE -! curve loop can be made of curves that share geometrically identical (but -! topologically different) points. If `tag' is positive, set the tag -! explicitly; otherwise a new tag is selected automatically. Return the tag -! of the curve loop. - function gmshModelOccAddCurveLoop( - & curveTags, - & curveTags_n, - & tag, - & ierr) - & bind(C, name = "gmshModelOccAddCurveLoop") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddCurveLoop - integer(c_int)::curveTags(*) - integer(c_size_t), value :: curveTags_n - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelOccAddCurveLoop - -! Add a rectangle in the OpenCASCADE CAD representation, with lower left -! corner at (`x', `y', `z') and upper right corner at (`x' + `dx', `y' + -! `dy', `z'). If `tag' is positive, set the tag explicitly; otherwise a new -! tag is selected automatically. Round the corners if `roundedRadius' is -! nonzero. Return the tag of the rectangle. - function gmshModelOccAddRectangle( - & x, - & y, - & z, - & dx, - & dy, - & tag, - & roundedRadius, - & ierr) - & bind(C, name = "gmshModelOccAddRectangle") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddRectangle - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - real(c_double), value::dx - real(c_double), value::dy - integer(c_int), value::tag - real(c_double), value::roundedRadius - integer(c_int)::ierr - end function gmshModelOccAddRectangle - -! Add a disk in the OpenCASCADE CAD representation, with center (`xc', `yc', -! `zc') and radius `rx' along the x-axis and `ry' along the y-axis (`rx' >= -! `ry'). If `tag' is positive, set the tag explicitly; otherwise a new tag is -! selected automatically. If a vector `zAxis' of size 3 is provided, use it -! as the normal to the disk (z-axis). If a vector `xAxis' of size 3 is -! provided in addition to `zAxis', use it to define the x-axis. Return the -! tag of the disk. - function gmshModelOccAddDisk( - & xc, - & yc, - & zc, - & rx, - & ry, - & tag, - & zAxis, - & zAxis_n, - & xAxis, - & xAxis_n, - & ierr) - & bind(C, name = "gmshModelOccAddDisk") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddDisk - real(c_double), value::xc - real(c_double), value::yc - real(c_double), value::zc - real(c_double), value::rx - real(c_double), value::ry - integer(c_int), value::tag - real(c_double)::zAxis(*) - integer(c_size_t), value :: zAxis_n - real(c_double)::xAxis(*) - integer(c_size_t), value :: xAxis_n - integer(c_int)::ierr - end function gmshModelOccAddDisk - -! Add a plane surface in the OpenCASCADE CAD representation, defined by one -! or more curve loops (or closed wires) `wireTags'. The first curve loop -! defines the exterior contour; additional curve loop define holes. If `tag' -! is positive, set the tag explicitly; otherwise a new tag is selected -! automatically. Return the tag of the surface. - function gmshModelOccAddPlaneSurface( - & wireTags, - & wireTags_n, - & tag, - & ierr) - & bind(C, name = "gmshModelOccAddPlaneSurface") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddPlaneSurface - integer(c_int)::wireTags(*) - integer(c_size_t), value :: wireTags_n - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelOccAddPlaneSurface - -! Add a surface in the OpenCASCADE CAD representation, filling the curve loop -! `wireTag'. If `tag' is positive, set the tag explicitly; otherwise a new -! tag is selected automatically. Return the tag of the surface. If -! `pointTags' are provided, force the surface to pass through the given -! points. The other optional arguments are `degree' (the degree of the energy -! criterion to minimize for computing the deformation of the surface), -! `numPointsOnCurves' (the average number of points for discretisation of the -! bounding curves), `numIter' (the maximum number of iterations of the -! optimization process), `anisotropic' (improve performance when the ratio of -! the length along the two parametric coordinates of the surface is high), -! `tol2d' (tolerance to the constraints in the parametric plane of the -! surface), `tol3d' (the maximum distance allowed between the support surface -! and the constraints), `tolAng' (the maximum angle allowed between the -! normal of the surface and the constraints), `tolCurv' (the maximum -! difference of curvature allowed between the surface and the constraint), -! `maxDegree' (the highest degree which the polynomial defining the filling -! surface can have) and, `maxSegments' (the largest number of segments which -! the filling surface can have). - function gmshModelOccAddSurfaceFilling( - & wireTag, - & tag, - & pointTags, - & pointTags_n, - & degree, - & numPointsOnCurves, - & numIter, - & anisotropic, - & tol2d, - & tol3d, - & tolAng, - & tolCurv, - & maxDegree, - & maxSegments, - & ierr) - & bind(C, name = "gmshModelOccAddSurfaceFilling") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddSurfaceFilling - integer(c_int), value::wireTag - integer(c_int), value::tag - integer(c_int)::pointTags(*) - integer(c_size_t), value :: pointTags_n - integer(c_int), value::degree - integer(c_int), value::numPointsOnCurves - integer(c_int), value::numIter - integer(c_int), value::anisotropic - real(c_double), value::tol2d - real(c_double), value::tol3d - real(c_double), value::tolAng - real(c_double), value::tolCurv - integer(c_int), value::maxDegree - integer(c_int), value::maxSegments - integer(c_int)::ierr - end function gmshModelOccAddSurfaceFilling - -! Add a BSpline surface in the OpenCASCADE CAD representation, filling the -! curve loop `wireTag'. The curve loop should be made of 2, 3 or 4 curves. -! The optional `type' argument specifies the type of filling: "Stretch" -! creates the flattest patch, "Curved" (the default) creates the most rounded -! patch, and "Coons" creates a rounded patch with less depth than "Curved". -! If `tag' is positive, set the tag explicitly; otherwise a new tag is -! selected automatically. Return the tag of the surface. - function gmshModelOccAddBSplineFilling( - & wireTag, - & tag, - & type, - & ierr) - & bind(C, name = "gmshModelOccAddBSplineFilling") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddBSplineFilling - integer(c_int), value::wireTag - integer(c_int), value::tag - character(len = 1, kind = c_char)::type(*) - integer(c_int)::ierr - end function gmshModelOccAddBSplineFilling - -! Add a Bezier surface in the OpenCASCADE CAD representation, filling the -! curve loop `wireTag'. The curve loop should be made of 2, 3 or 4 Bezier -! curves. The optional `type' argument specifies the type of filling: -! "Stretch" creates the flattest patch, "Curved" (the default) creates the -! most rounded patch, and "Coons" creates a rounded patch with less depth -! than "Curved". If `tag' is positive, set the tag explicitly; otherwise a -! new tag is selected automatically. Return the tag of the surface. - function gmshModelOccAddBezierFilling( - & wireTag, - & tag, - & type, - & ierr) - & bind(C, name = "gmshModelOccAddBezierFilling") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddBezierFilling - integer(c_int), value::wireTag - integer(c_int), value::tag - character(len = 1, kind = c_char)::type(*) - integer(c_int)::ierr - end function gmshModelOccAddBezierFilling - -! Add a b-spline surface of degree `degreeU' x `degreeV' in the OpenCASCADE -! CAD representation, with `pointTags' control points given as a single -! vector [Pu1v1, ... Pu`numPointsU'v1, Pu1v2, ...]. If `weights', `knotsU', -! `knotsV', `multiplicitiesU' or `multiplicitiesV' are not provided, default -! parameters are computed automatically. If `tag' is positive, set the tag -! explicitly; otherwise a new tag is selected automatically. If `wireTags' is -! provided, trim the b-spline patch using the provided wires: the first wire -! defines the external contour, the others define holes. If `wire3D' is set, -! consider wire curves as 3D curves and project them on the b-spline surface; -! otherwise consider the wire curves as defined in the parametric space of -! the surface. Return the tag of the b-spline surface. - function gmshModelOccAddBSplineSurface( - & pointTags, - & pointTags_n, - & numPointsU, - & tag, - & degreeU, - & degreeV, - & weights, - & weights_n, - & knotsU, - & knotsU_n, - & knotsV, - & knotsV_n, - & multiplicitiesU, - & multiplicitiesU_n, - & multiplicitiesV, - & multiplicitiesV_n, - & wireTags, - & wireTags_n, - & wire3D, - & ierr) - & bind(C, name = "gmshModelOccAddBSplineSurface") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddBSplineSurface - integer(c_int)::pointTags(*) - integer(c_size_t), value :: pointTags_n - integer(c_int), value::numPointsU - integer(c_int), value::tag - integer(c_int), value::degreeU - integer(c_int), value::degreeV - real(c_double)::weights(*) - integer(c_size_t), value :: weights_n - real(c_double)::knotsU(*) - integer(c_size_t), value :: knotsU_n - real(c_double)::knotsV(*) - integer(c_size_t), value :: knotsV_n - integer(c_int)::multiplicitiesU(*) - integer(c_size_t), value :: multiplicitiesU_n - integer(c_int)::multiplicitiesV(*) - integer(c_size_t), value :: multiplicitiesV_n - integer(c_int)::wireTags(*) - integer(c_size_t), value :: wireTags_n - integer(c_int), value::wire3D - integer(c_int)::ierr - end function gmshModelOccAddBSplineSurface - -! Add a Bezier surface in the OpenCASCADE CAD representation, with -! `pointTags' control points given as a single vector [Pu1v1, ... -! Pu`numPointsU'v1, Pu1v2, ...]. If `tag' is positive, set the tag -! explicitly; otherwise a new tag is selected automatically. If `wireTags' is -! provided, trim the Bezier patch using the provided wires: the first wire -! defines the external contour, the others define holes. If `wire3D' is set, -! consider wire curves as 3D curves and project them on the Bezier surface; -! otherwise consider the wire curves as defined in the parametric space of -! the surface. Return the tag of the Bezier surface. - function gmshModelOccAddBezierSurface( - & pointTags, - & pointTags_n, - & numPointsU, - & tag, - & wireTags, - & wireTags_n, - & wire3D, - & ierr) - & bind(C, name = "gmshModelOccAddBezierSurface") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddBezierSurface - integer(c_int)::pointTags(*) - integer(c_size_t), value :: pointTags_n - integer(c_int), value::numPointsU - integer(c_int), value::tag - integer(c_int)::wireTags(*) - integer(c_size_t), value :: wireTags_n - integer(c_int), value::wire3D - integer(c_int)::ierr - end function gmshModelOccAddBezierSurface - -! Trim the surface `surfaceTag' with the wires `wireTags', replacing any -! existing trimming curves. The first wire defines the external contour, the -! others define holes. If `wire3D' is set, consider wire curves as 3D curves -! and project them on the surface; otherwise consider the wire curves as -! defined in the parametric space of the surface. If `tag' is positive, set -! the tag explicitly; otherwise a new tag is selected automatically. Return -! the tag of the trimmed surface. - function gmshModelOccAddTrimmedSurface( - & surfaceTag, - & wireTags, - & wireTags_n, - & wire3D, - & tag, - & ierr) - & bind(C, name = "gmshModelOccAddTrimmedSurface") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddTrimmedSurface - integer(c_int), value::surfaceTag - integer(c_int)::wireTags(*) - integer(c_size_t), value :: wireTags_n - integer(c_int), value::wire3D - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelOccAddTrimmedSurface - -! Add a surface loop (a closed shell) in the OpenCASCADE CAD representation, -! formed by `surfaceTags'. If `tag' is positive, set the tag explicitly; -! otherwise a new tag is selected automatically. Return the tag of the -! surface loop. Setting `sewing' allows one to build a shell made of surfaces -! that share geometrically identical (but topologically different) curves. - function gmshModelOccAddSurfaceLoop( - & surfaceTags, - & surfaceTags_n, - & tag, - & sewing, - & ierr) - & bind(C, name = "gmshModelOccAddSurfaceLoop") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddSurfaceLoop - integer(c_int)::surfaceTags(*) - integer(c_size_t), value :: surfaceTags_n - integer(c_int), value::tag - integer(c_int), value::sewing - integer(c_int)::ierr - end function gmshModelOccAddSurfaceLoop - -! Add a volume (a region) in the OpenCASCADE CAD representation, defined by -! one or more surface loops `shellTags'. The first surface loop defines the -! exterior boundary; additional surface loop define holes. If `tag' is -! positive, set the tag explicitly; otherwise a new tag is selected -! automatically. Return the tag of the volume. - function gmshModelOccAddVolume( - & shellTags, - & shellTags_n, - & tag, - & ierr) - & bind(C, name = "gmshModelOccAddVolume") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddVolume - integer(c_int)::shellTags(*) - integer(c_size_t), value :: shellTags_n - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelOccAddVolume - -! Add a sphere of center (`xc', `yc', `zc') and radius `r' in the OpenCASCADE -! CAD representation. The optional `angle1' and `angle2' arguments define the -! polar angle opening (from -Pi/2 to Pi/2). The optional `angle3' argument -! defines the azimuthal opening (from 0 to 2*Pi). If `tag' is positive, set -! the tag explicitly; otherwise a new tag is selected automatically. Return -! the tag of the sphere. - function gmshModelOccAddSphere( - & xc, - & yc, - & zc, - & radius, - & tag, - & angle1, - & angle2, - & angle3, - & ierr) - & bind(C, name = "gmshModelOccAddSphere") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddSphere - real(c_double), value::xc - real(c_double), value::yc - real(c_double), value::zc - real(c_double), value::radius - integer(c_int), value::tag - real(c_double), value::angle1 - real(c_double), value::angle2 - real(c_double), value::angle3 - integer(c_int)::ierr - end function gmshModelOccAddSphere - -! Add a parallelepipedic box in the OpenCASCADE CAD representation, defined -! by a point (`x', `y', `z') and the extents along the x-, y- and z-axes. If -! `tag' is positive, set the tag explicitly; otherwise a new tag is selected -! automatically. Return the tag of the box. - function gmshModelOccAddBox( - & x, - & y, - & z, - & dx, - & dy, - & dz, - & tag, - & ierr) - & bind(C, name = "gmshModelOccAddBox") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddBox - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - real(c_double), value::dx - real(c_double), value::dy - real(c_double), value::dz - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshModelOccAddBox - -! Add a cylinder in the OpenCASCADE CAD representation, defined by the center -! (`x', `y', `z') of its first circular face, the 3 components (`dx', `dy', -! `dz') of the vector defining its axis and its radius `r'. The optional -! `angle' argument defines the angular opening (from 0 to 2*Pi). If `tag' is -! positive, set the tag explicitly; otherwise a new tag is selected -! automatically. Return the tag of the cylinder. - function gmshModelOccAddCylinder( - & x, - & y, - & z, - & dx, - & dy, - & dz, - & r, - & tag, - & angle, - & ierr) - & bind(C, name = "gmshModelOccAddCylinder") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddCylinder - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - real(c_double), value::dx - real(c_double), value::dy - real(c_double), value::dz - real(c_double), value::r - integer(c_int), value::tag - real(c_double), value::angle - integer(c_int)::ierr - end function gmshModelOccAddCylinder - -! Add a cone in the OpenCASCADE CAD representation, defined by the center -! (`x', `y', `z') of its first circular face, the 3 components of the vector -! (`dx', `dy', `dz') defining its axis and the two radii `r1' and `r2' of the -! faces (these radii can be zero). If `tag' is positive, set the tag -! explicitly; otherwise a new tag is selected automatically. `angle' defines -! the optional angular opening (from 0 to 2*Pi). Return the tag of the cone. - function gmshModelOccAddCone( - & x, - & y, - & z, - & dx, - & dy, - & dz, - & r1, - & r2, - & tag, - & angle, - & ierr) - & bind(C, name = "gmshModelOccAddCone") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddCone - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - real(c_double), value::dx - real(c_double), value::dy - real(c_double), value::dz - real(c_double), value::r1 - real(c_double), value::r2 - integer(c_int), value::tag - real(c_double), value::angle - integer(c_int)::ierr - end function gmshModelOccAddCone - -! Add a right angular wedge in the OpenCASCADE CAD representation, defined by -! the right-angle point (`x', `y', `z') and the 3 extends along the x-, y- -! and z-axes (`dx', `dy', `dz'). If `tag' is positive, set the tag -! explicitly; otherwise a new tag is selected automatically. The optional -! argument `ltx' defines the top extent along the x-axis. If a vector `zAxis' -! of size 3 is provided, use it to define the z-axis. Return the tag of the -! wedge. - function gmshModelOccAddWedge( - & x, - & y, - & z, - & dx, - & dy, - & dz, - & tag, - & ltx, - & zAxis, - & zAxis_n, - & ierr) - & bind(C, name = "gmshModelOccAddWedge") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddWedge - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - real(c_double), value::dx - real(c_double), value::dy - real(c_double), value::dz - integer(c_int), value::tag - real(c_double), value::ltx - real(c_double)::zAxis(*) - integer(c_size_t), value :: zAxis_n - integer(c_int)::ierr - end function gmshModelOccAddWedge - -! Add a torus in the OpenCASCADE CAD representation, defined by its center -! (`x', `y', `z') and its 2 radii `r' and `r2'. If `tag' is positive, set the -! tag explicitly; otherwise a new tag is selected automatically. The optional -! argument `angle' defines the angular opening (from 0 to 2*Pi). If a vector -! `zAxis' of size 3 is provided, use it to define the z-axis. Return the tag -! of the torus. - function gmshModelOccAddTorus( - & x, - & y, - & z, - & r1, - & r2, - & tag, - & angle, - & zAxis, - & zAxis_n, - & ierr) - & bind(C, name = "gmshModelOccAddTorus") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccAddTorus - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - real(c_double), value::r1 - real(c_double), value::r2 - integer(c_int), value::tag - real(c_double), value::angle - real(c_double)::zAxis(*) - integer(c_size_t), value :: zAxis_n - integer(c_int)::ierr - end function gmshModelOccAddTorus - -! Add a volume (if the optional argument `makeSolid' is set) or surfaces in -! the OpenCASCADE CAD representation, defined through the open or closed -! wires `wireTags'. If `tag' is positive, set the tag explicitly; otherwise a -! new tag is selected automatically. The new entities are returned in -! `outDimTags'. If the optional argument `makeRuled' is set, the surfaces -! created on the boundary are forced to be ruled surfaces. If `maxDegree' is -! positive, set the maximal degree of resulting surface. - subroutine gmshModelOccAddThruSections( - & wireTags, - & wireTags_n, - & outDimTags, - & outDimTags_n, - & tag, - & makeSolid, - & makeRuled, - & maxDegree, - & ierr) - & bind(C, name = "gmshModelOccAddThruSections") - use, intrinsic :: iso_c_binding - integer(c_int)::wireTags(*) - integer(c_size_t), value :: wireTags_n - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - integer(c_int), value::tag - integer(c_int), value::makeSolid - integer(c_int), value::makeRuled - integer(c_int), value::maxDegree - integer(c_int)::ierr - end subroutine gmshModelOccAddThruSections - -! Add a hollowed volume in the OpenCASCADE CAD representation, built from an -! initial volume `volumeTag' and a set of faces from this volume -! `excludeSurfaceTags', which are to be removed. The remaining faces of the -! volume become the walls of the hollowed solid, with thickness `offset'. If -! `tag' is positive, set the tag explicitly; otherwise a new tag is selected -! automatically. - subroutine gmshModelOccAddThickSolid( - & volumeTag, - & excludeSurfaceTags, - & excludeSurfaceTags_n, - & offset, - & outDimTags, - & outDimTags_n, - & tag, - & ierr) - & bind(C, name = "gmshModelOccAddThickSolid") - use, intrinsic :: iso_c_binding - integer(c_int), value::volumeTag - integer(c_int)::excludeSurfaceTags(*) - integer(c_size_t), value :: excludeSurfaceTags_n - real(c_double), value::offset - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - integer(c_int), value::tag - integer(c_int)::ierr - end subroutine gmshModelOccAddThickSolid - -! Extrude the entities `dimTags' in the OpenCASCADE CAD representation, using -! a translation along (`dx', `dy', `dz'). Return extruded entities in -! `outDimTags'. If `numElements' is not empty, also extrude the mesh: the -! entries in `numElements' give the number of elements in each layer. If -! `height' is not empty, it provides the (cumulative) height of the different -! layers, normalized to 1. If `recombine' is set, recombine the mesh in the -! layers. - subroutine gmshModelOccExtrude( - & dimTags, - & dimTags_n, - & dx, - & dy, - & dz, - & outDimTags, - & outDimTags_n, - & numElements, - & numElements_n, - & heights, - & heights_n, - & recombine, - & ierr) - & bind(C, name = "gmshModelOccExtrude") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::dx - real(c_double), value::dy - real(c_double), value::dz - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - integer(c_int)::numElements(*) - integer(c_size_t), value :: numElements_n - real(c_double)::heights(*) - integer(c_size_t), value :: heights_n - integer(c_int), value::recombine - integer(c_int)::ierr - end subroutine gmshModelOccExtrude - -! Extrude the entities `dimTags' in the OpenCASCADE CAD representation, using -! a rotation of `angle' radians around the axis of revolution defined by the -! point (`x', `y', `z') and the direction (`ax', `ay', `az'). Return extruded -! entities in `outDimTags'. If `numElements' is not empty, also extrude the -! mesh: the entries in `numElements' give the number of elements in each -! layer. If `height' is not empty, it provides the (cumulative) height of the -! different layers, normalized to 1. When the mesh is extruded the angle -! should be strictly smaller than 2*Pi. If `recombine' is set, recombine the -! mesh in the layers. - subroutine gmshModelOccRevolve( - & dimTags, - & dimTags_n, - & x, - & y, - & z, - & ax, - & ay, - & az, - & angle, - & outDimTags, - & outDimTags_n, - & numElements, - & numElements_n, - & heights, - & heights_n, - & recombine, - & ierr) - & bind(C, name = "gmshModelOccRevolve") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - real(c_double), value::ax - real(c_double), value::ay - real(c_double), value::az - real(c_double), value::angle - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - integer(c_int)::numElements(*) - integer(c_size_t), value :: numElements_n - real(c_double)::heights(*) - integer(c_size_t), value :: heights_n - integer(c_int), value::recombine - integer(c_int)::ierr - end subroutine gmshModelOccRevolve - -! Add a pipe in the OpenCASCADE CAD representation, by extruding the entities -! `dimTags' along the wire `wireTag'. The type of sweep can be specified with -! `trihedron' (possible values: "DiscreteTrihedron", "CorrectedFrenet", -! "Fixed", "Frenet", "ConstantNormal", "Darboux", "GuideAC", "GuidePlan", -! "GuideACWithContact", "GuidePlanWithContact"). If `trihedron' is not -! provided, "DiscreteTrihedron" is assumed. Return the pipe in `outDimTags'. - subroutine gmshModelOccAddPipe( - & dimTags, - & dimTags_n, - & wireTag, - & outDimTags, - & outDimTags_n, - & trihedron, - & ierr) - & bind(C, name = "gmshModelOccAddPipe") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int), value::wireTag - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - character(len = 1, kind = c_char)::trihedron(*) - integer(c_int)::ierr - end subroutine gmshModelOccAddPipe - -! Fillet the volumes `volumeTags' on the curves `curveTags' with radii -! `radii'. The `radii' vector can either contain a single radius, as many -! radii as `curveTags', or twice as many as `curveTags' (in which case -! different radii are provided for the begin and end points of the curves). -! Return the filleted entities in `outDimTags'. Remove the original volume if -! `removeVolume' is set. - subroutine gmshModelOccFillet( - & volumeTags, - & volumeTags_n, - & curveTags, - & curveTags_n, - & radii, - & radii_n, - & outDimTags, - & outDimTags_n, - & removeVolume, - & ierr) - & bind(C, name = "gmshModelOccFillet") - use, intrinsic :: iso_c_binding - integer(c_int)::volumeTags(*) - integer(c_size_t), value :: volumeTags_n - integer(c_int)::curveTags(*) - integer(c_size_t), value :: curveTags_n - real(c_double)::radii(*) - integer(c_size_t), value :: radii_n - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - integer(c_int), value::removeVolume - integer(c_int)::ierr - end subroutine gmshModelOccFillet - -! Chamfer the volumes `volumeTags' on the curves `curveTags' with distances -! `distances' measured on surfaces `surfaceTags'. The `distances' vector can -! either contain a single distance, as many distances as `curveTags' and -! `surfaceTags', or twice as many as `curveTags' and `surfaceTags' (in which -! case the first in each pair is measured on the corresponding surface in -! `surfaceTags', the other on the other adjacent surface). Return the -! chamfered entities in `outDimTags'. Remove the original volume if -! `removeVolume' is set. - subroutine gmshModelOccChamfer( - & volumeTags, - & volumeTags_n, - & curveTags, - & curveTags_n, - & surfaceTags, - & surfaceTags_n, - & distances, - & distances_n, - & outDimTags, - & outDimTags_n, - & removeVolume, - & ierr) - & bind(C, name = "gmshModelOccChamfer") - use, intrinsic :: iso_c_binding - integer(c_int)::volumeTags(*) - integer(c_size_t), value :: volumeTags_n - integer(c_int)::curveTags(*) - integer(c_size_t), value :: curveTags_n - integer(c_int)::surfaceTags(*) - integer(c_size_t), value :: surfaceTags_n - real(c_double)::distances(*) - integer(c_size_t), value :: distances_n - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - integer(c_int), value::removeVolume - integer(c_int)::ierr - end subroutine gmshModelOccChamfer - -! Compute the boolean union (the fusion) of the entities `objectDimTags' and -! `toolDimTags' in the OpenCASCADE CAD representation. Return the resulting -! entities in `outDimTags'. If `tag' is positive, try to set the tag -! explicitly (only valid if the boolean operation results in a single -! entity). Remove the object if `removeObject' is set. Remove the tool if -! `removeTool' is set. - subroutine gmshModelOccFuse( - & objectDimTags, - & objectDimTags_n, - & toolDimTags, - & toolDimTags_n, - & outDimTags, - & outDimTags_n, - & outDimTagsMap, - & outDimTagsMap_n, - & outDimTagsMap_nn, - & tag, - & removeObject, - & removeTool, - & ierr) - & bind(C, name = "gmshModelOccFuse") - use, intrinsic :: iso_c_binding - integer(c_int)::objectDimTags(*) - integer(c_size_t), value :: objectDimTags_n - integer(c_int)::toolDimTags(*) - integer(c_size_t), value :: toolDimTags_n - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - type (C_PTR), intent(out)::outDimTagsMap - type(c_ptr), intent(out) :: outDimTagsMap_n - integer (C_SIZE_T) ::outDimTagsMap_nn - integer(c_int), value::tag - integer(c_int), value::removeObject - integer(c_int), value::removeTool - integer(c_int)::ierr - end subroutine gmshModelOccFuse - -! Compute the boolean intersection (the common parts) of the entities -! `objectDimTags' and `toolDimTags' in the OpenCASCADE CAD representation. -! Return the resulting entities in `outDimTags'. If `tag' is positive, try to -! set the tag explicitly (only valid if the boolean operation results in a -! single entity). Remove the object if `removeObject' is set. Remove the tool -! if `removeTool' is set. - subroutine gmshModelOccIntersect( - & objectDimTags, - & objectDimTags_n, - & toolDimTags, - & toolDimTags_n, - & outDimTags, - & outDimTags_n, - & outDimTagsMap, - & outDimTagsMap_n, - & outDimTagsMap_nn, - & tag, - & removeObject, - & removeTool, - & ierr) - & bind(C, name = "gmshModelOccIntersect") - use, intrinsic :: iso_c_binding - integer(c_int)::objectDimTags(*) - integer(c_size_t), value :: objectDimTags_n - integer(c_int)::toolDimTags(*) - integer(c_size_t), value :: toolDimTags_n - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - type (C_PTR), intent(out)::outDimTagsMap - type(c_ptr), intent(out) :: outDimTagsMap_n - integer (C_SIZE_T) ::outDimTagsMap_nn - integer(c_int), value::tag - integer(c_int), value::removeObject - integer(c_int), value::removeTool - integer(c_int)::ierr - end subroutine gmshModelOccIntersect - -! Compute the boolean difference between the entities `objectDimTags' and -! `toolDimTags' in the OpenCASCADE CAD representation. Return the resulting -! entities in `outDimTags'. If `tag' is positive, try to set the tag -! explicitly (only valid if the boolean operation results in a single -! entity). Remove the object if `removeObject' is set. Remove the tool if -! `removeTool' is set. - subroutine gmshModelOccCut( - & objectDimTags, - & objectDimTags_n, - & toolDimTags, - & toolDimTags_n, - & outDimTags, - & outDimTags_n, - & outDimTagsMap, - & outDimTagsMap_n, - & outDimTagsMap_nn, - & tag, - & removeObject, - & removeTool, - & ierr) - & bind(C, name = "gmshModelOccCut") - use, intrinsic :: iso_c_binding - integer(c_int)::objectDimTags(*) - integer(c_size_t), value :: objectDimTags_n - integer(c_int)::toolDimTags(*) - integer(c_size_t), value :: toolDimTags_n - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - type (C_PTR), intent(out)::outDimTagsMap - type(c_ptr), intent(out) :: outDimTagsMap_n - integer (C_SIZE_T) ::outDimTagsMap_nn - integer(c_int), value::tag - integer(c_int), value::removeObject - integer(c_int), value::removeTool - integer(c_int)::ierr - end subroutine gmshModelOccCut - -! Compute the boolean fragments (general fuse) resulting from the -! intersection of the entities `objectDimTags' and `toolDimTags' in the -! OpenCASCADE CAD representation, making all iterfaces conformal. When -! applied to entities of different dimensions, the lower dimensional entities -! will be automatically embedded in the higher dimensional entities if they -! are not on their boundary. Return the resulting entities in `outDimTags'. -! If `tag' is positive, try to set the tag explicitly (only valid if the -! boolean operation results in a single entity). Remove the object if -! `removeObject' is set. Remove the tool if `removeTool' is set. - subroutine gmshModelOccFragment( - & objectDimTags, - & objectDimTags_n, - & toolDimTags, - & toolDimTags_n, - & outDimTags, - & outDimTags_n, - & outDimTagsMap, - & outDimTagsMap_n, - & outDimTagsMap_nn, - & tag, - & removeObject, - & removeTool, - & ierr) - & bind(C, name = "gmshModelOccFragment") - use, intrinsic :: iso_c_binding - integer(c_int)::objectDimTags(*) - integer(c_size_t), value :: objectDimTags_n - integer(c_int)::toolDimTags(*) - integer(c_size_t), value :: toolDimTags_n - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - type (C_PTR), intent(out)::outDimTagsMap - type(c_ptr), intent(out) :: outDimTagsMap_n - integer (C_SIZE_T) ::outDimTagsMap_nn - integer(c_int), value::tag - integer(c_int), value::removeObject - integer(c_int), value::removeTool - integer(c_int)::ierr - end subroutine gmshModelOccFragment - -! Translate the entities `dimTags' in the OpenCASCADE CAD representation -! along (`dx', `dy', `dz'). - subroutine gmshModelOccTranslate( - & dimTags, - & dimTags_n, - & dx, - & dy, - & dz, - & ierr) - & bind(C, name = "gmshModelOccTranslate") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::dx - real(c_double), value::dy - real(c_double), value::dz - integer(c_int)::ierr - end subroutine gmshModelOccTranslate - -! Rotate the entities `dimTags' in the OpenCASCADE CAD representation by -! `angle' radians around the axis of revolution defined by the point (`x', -! `y', `z') and the direction (`ax', `ay', `az'). - subroutine gmshModelOccRotate( - & dimTags, - & dimTags_n, - & x, - & y, - & z, - & ax, - & ay, - & az, - & angle, - & ierr) - & bind(C, name = "gmshModelOccRotate") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - real(c_double), value::ax - real(c_double), value::ay - real(c_double), value::az - real(c_double), value::angle - integer(c_int)::ierr - end subroutine gmshModelOccRotate - -! Scale the entities `dimTags' in the OpenCASCADE CAD representation by -! factors `a', `b' and `c' along the three coordinate axes; use (`x', `y', -! `z') as the center of the homothetic transformation. - subroutine gmshModelOccDilate( - & dimTags, - & dimTags_n, - & x, - & y, - & z, - & a, - & b, - & c, - & ierr) - & bind(C, name = "gmshModelOccDilate") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - real(c_double), value::a - real(c_double), value::b - real(c_double), value::c - integer(c_int)::ierr - end subroutine gmshModelOccDilate - -! Mirror the entities `dimTags' in the OpenCASCADE CAD representation, with -! respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0. - subroutine gmshModelOccMirror( - & dimTags, - & dimTags_n, - & a, - & b, - & c, - & d, - & ierr) - & bind(C, name = "gmshModelOccMirror") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::a - real(c_double), value::b - real(c_double), value::c - real(c_double), value::d - integer(c_int)::ierr - end subroutine gmshModelOccMirror - -! Mirror the entities `dimTags' in the OpenCASCADE CAD representation, with -! respect to the plane of equation `a' * x + `b' * y + `c' * z + `d' = 0. -! (This is a deprecated synonym for `mirror'.) - subroutine gmshModelOccSymmetrize( - & dimTags, - & dimTags_n, - & a, - & b, - & c, - & d, - & ierr) - & bind(C, name = "gmshModelOccSymmetrize") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::a - real(c_double), value::b - real(c_double), value::c - real(c_double), value::d - integer(c_int)::ierr - end subroutine gmshModelOccSymmetrize - -! Apply a general affine transformation matrix `affineTransform' (16 entries -! of a 4x4 matrix, by row; only the 12 first can be provided for convenience) -! to the entities `dimTags' in the OpenCASCADE CAD representation. - subroutine gmshModelOccAffineTransform( - & dimTags, - & dimTags_n, - & affineTransform, - & affineTransform_n, - & ierr) - & bind(C, name = "gmshModelOccAffineTransform") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double)::affineTransform(*) - integer(c_size_t), value :: affineTransform_n - integer(c_int)::ierr - end subroutine gmshModelOccAffineTransform - -! Copy the entities `dimTags' in the OpenCASCADE CAD representation; the new -! entities are returned in `outDimTags'. - subroutine gmshModelOccCopy( - & dimTags, - & dimTags_n, - & outDimTags, - & outDimTags_n, - & ierr) - & bind(C, name = "gmshModelOccCopy") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - integer(c_int)::ierr - end subroutine gmshModelOccCopy - -! Remove the entities `dimTags' in the OpenCASCADE CAD representation, -! provided that they are not on the boundary of higher-dimensional entities. -! If `recursive' is true, remove all the entities on their boundaries, down -! to dimension 0. - subroutine gmshModelOccRemove( - & dimTags, - & dimTags_n, - & recursive, - & ierr) - & bind(C, name = "gmshModelOccRemove") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int), value::recursive - integer(c_int)::ierr - end subroutine gmshModelOccRemove - -! Remove all duplicate entities in the OpenCASCADE CAD representation -! (different entities at the same geometrical location) after intersecting -! (using boolean fragments) all highest dimensional entities. - subroutine gmshModelOccRemoveAllDuplicates( - & ierr) - & bind(C, name = "gmshModelOccRemoveAllDuplicates") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshModelOccRemoveAllDuplicates - -! Apply various healing procedures to the entities `dimTags' (or to all the -! entities in the model if `dimTags' is empty) in the OpenCASCADE CAD -! representation. Return the healed entities in `outDimTags'. - subroutine gmshModelOccHealShapes( - & outDimTags, - & outDimTags_n, - & dimTags, - & dimTags_n, - & tolerance, - & fixDegenerated, - & fixSmallEdges, - & fixSmallFaces, - & sewFaces, - & makeSolids, - & ierr) - & bind(C, name = "gmshModelOccHealShapes") - use, intrinsic :: iso_c_binding - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::tolerance - integer(c_int), value::fixDegenerated - integer(c_int), value::fixSmallEdges - integer(c_int), value::fixSmallFaces - integer(c_int), value::sewFaces - integer(c_int), value::makeSolids - integer(c_int)::ierr - end subroutine gmshModelOccHealShapes - -! Convert the entities `dimTags' to NURBS. - subroutine gmshModelOccConvertToNURBS( - & dimTags, - & dimTags_n, - & ierr) - & bind(C, name = "gmshModelOccConvertToNURBS") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - integer(c_int)::ierr - end subroutine gmshModelOccConvertToNURBS - -! Import BREP, STEP or IGES shapes from the file `fileName' in the -! OpenCASCADE CAD representation. The imported entities are returned in -! `outDimTags'. If the optional argument `highestDimOnly' is set, only import -! the highest dimensional entities in the file. The optional argument -! `format' can be used to force the format of the file (currently "brep", -! "step" or "iges"). - subroutine gmshModelOccImportShapes( - & fileName, - & outDimTags, - & outDimTags_n, - & highestDimOnly, - & format, - & ierr) - & bind(C, name = "gmshModelOccImportShapes") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::fileName(*) - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - integer(c_int), value::highestDimOnly - character(len = 1, kind = c_char)::format(*) - integer(c_int)::ierr - end subroutine gmshModelOccImportShapes - -! Imports an OpenCASCADE `shape' by providing a pointer to a native -! OpenCASCADE `TopoDS_Shape' object (passed as a pointer to void). The -! imported entities are returned in `outDimTags'. If the optional argument -! `highestDimOnly' is set, only import the highest dimensional entities in -! `shape'. In Python, this function can be used for integration with -! PythonOCC, in which the SwigPyObject pointer of `TopoDS_Shape' must be -! passed as an int to `shape', i.e., `shape = int(pythonocc_shape.this)'. -! Warning: this function is unsafe, as providing an invalid pointer will lead -! to undefined behavior. - subroutine gmshModelOccImportShapesNativePointer( - & shape, - & outDimTags, - & outDimTags_n, - & highestDimOnly, - & ierr) - & bind(C, name = "gmshModelOccImportShapesNativePointer") - use, intrinsic :: iso_c_binding - integer(c_int)::shape(*) - type(c_ptr), intent(out)::outDimTags - integer(c_size_t) :: outDimTags_n - integer(c_int), value::highestDimOnly - integer(c_int)::ierr - end subroutine gmshModelOccImportShapesNativePointer - -! Get all the OpenCASCADE entities. If `dim' is >= 0, return only the -! entities of the specified dimension (e.g. points if `dim' == 0). The -! entities are returned as a vector of (dim, tag) integer pairs. - subroutine gmshModelOccGetEntities( - & dimTags, - & dimTags_n, - & dim, - & ierr) - & bind(C, name = "gmshModelOccGetEntities") - use, intrinsic :: iso_c_binding - type(c_ptr), intent(out)::dimTags - integer(c_size_t) :: dimTags_n - integer(c_int), value::dim - integer(c_int)::ierr - end subroutine gmshModelOccGetEntities - -! Get the OpenCASCADE entities in the bounding box defined by the two points -! (`xmin', `ymin', `zmin') and (`xmax', `ymax', `zmax'). If `dim' is >= 0, -! return only the entities of the specified dimension (e.g. points if `dim' -! == 0). - subroutine gmshModelOccGetEntitiesInBoundingBox( - & xmin, - & ymin, - & zmin, - & xmax, - & ymax, - & zmax, - & tags, - & tags_n, - & dim, - & ierr) - & bind(C, name = "gmshModelOccGetEntitiesInBoundingBox") - use, intrinsic :: iso_c_binding - real(c_double), value::xmin - real(c_double), value::ymin - real(c_double), value::zmin - real(c_double), value::xmax - real(c_double), value::ymax - real(c_double), value::zmax - type(c_ptr), intent(out)::tags - integer(c_size_t) :: tags_n - integer(c_int), value::dim - integer(c_int)::ierr - end subroutine gmshModelOccGetEntitiesInBoundingBox - -! Get the bounding box (`xmin', `ymin', `zmin'), (`xmax', `ymax', `zmax') of -! the OpenCASCADE entity of dimension `dim' and tag `tag'. - subroutine gmshModelOccGetBoundingBox( - & dim, - & tag, - & xmin, - & ymin, - & zmin, - & xmax, - & ymax, - & zmax, - & ierr) - & bind(C, name = "gmshModelOccGetBoundingBox") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - real(c_double)::xmin - real(c_double)::ymin - real(c_double)::zmin - real(c_double)::xmax - real(c_double)::ymax - real(c_double)::zmax - integer(c_int)::ierr - end subroutine gmshModelOccGetBoundingBox - -! Get the tags `curveLoopTags' of the curve loops making up the surface of -! tag `surfaceTag', as well as the tags `curveTags' of the curves making up -! each curve loop. - subroutine gmshModelOccGetCurveLoops( - & surfaceTag, - & curveLoopTags, - & curveLoopTags_n, - & curveTags, - & curveTags_n, - & curveTags_nn, - & ierr) - & bind(C, name = "gmshModelOccGetCurveLoops") - use, intrinsic :: iso_c_binding - integer(c_int), value::surfaceTag - type(c_ptr), intent(out)::curveLoopTags - integer(c_size_t) :: curveLoopTags_n - type(c_ptr), intent(out)::curveTags - type(c_ptr), intent(out) :: curveTags_n - integer(c_size_t) :: curveTags_nn - integer(c_int)::ierr - end subroutine gmshModelOccGetCurveLoops - -! Get the tags `surfaceLoopTags' of the surface loops making up the volume of -! tag `volumeTag', as well as the tags `surfaceTags' of the surfaces making -! up each surface loop. - subroutine gmshModelOccGetSurfaceLoops( - & volumeTag, - & surfaceLoopTags, - & surfaceLoopTags_n, - & surfaceTags, - & surfaceTags_n, - & surfaceTags_nn, - & ierr) - & bind(C, name = "gmshModelOccGetSurfaceLoops") - use, intrinsic :: iso_c_binding - integer(c_int), value::volumeTag - type(c_ptr), intent(out)::surfaceLoopTags - integer(c_size_t) :: surfaceLoopTags_n - type(c_ptr), intent(out)::surfaceTags - type(c_ptr), intent(out) :: surfaceTags_n - integer(c_size_t) :: surfaceTags_nn - integer(c_int)::ierr - end subroutine gmshModelOccGetSurfaceLoops - -! Get the mass of the OpenCASCADE entity of dimension `dim' and tag `tag'. - subroutine gmshModelOccGetMass( - & dim, - & tag, - & mass, - & ierr) - & bind(C, name = "gmshModelOccGetMass") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - real(c_double)::mass - integer(c_int)::ierr - end subroutine gmshModelOccGetMass - -! Get the center of mass of the OpenCASCADE entity of dimension `dim' and tag -! `tag'. - subroutine gmshModelOccGetCenterOfMass( - & dim, - & tag, - & x, - & y, - & z, - & ierr) - & bind(C, name = "gmshModelOccGetCenterOfMass") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - real(c_double)::x - real(c_double)::y - real(c_double)::z - integer(c_int)::ierr - end subroutine gmshModelOccGetCenterOfMass - -! Get the matrix of inertia (by row) of the OpenCASCADE entity of dimension -! `dim' and tag `tag'. - subroutine gmshModelOccGetMatrixOfInertia( - & dim, - & tag, - & mat, - & mat_n, - & ierr) - & bind(C, name = "gmshModelOccGetMatrixOfInertia") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - type(c_ptr), intent(out)::mat - integer(c_size_t) :: mat_n - integer(c_int)::ierr - end subroutine gmshModelOccGetMatrixOfInertia - -! Get the maximum tag of entities of dimension `dim' in the OpenCASCADE CAD -! representation. - function gmshModelOccGetMaxTag( - & dim, - & ierr) - & bind(C, name = "gmshModelOccGetMaxTag") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshModelOccGetMaxTag - integer(c_int), value::dim - integer(c_int)::ierr - end function gmshModelOccGetMaxTag - -! Set the maximum tag `maxTag' for entities of dimension `dim' in the -! OpenCASCADE CAD representation. - subroutine gmshModelOccSetMaxTag( - & dim, - & maxTag, - & ierr) - & bind(C, name = "gmshModelOccSetMaxTag") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::maxTag - integer(c_int)::ierr - end subroutine gmshModelOccSetMaxTag - -! Synchronize the OpenCASCADE CAD representation with the current Gmsh model. -! This can be called at any time, but since it involves a non trivial amount -! of processing, the number of synchronization points should normally be -! minimized. Without synchronization the entities in the OpenCASCADE CAD -! representation are not available to any function outside of the OpenCASCADE -! CAD kernel functions. - subroutine gmshModelOccSynchronize( - & ierr) - & bind(C, name = "gmshModelOccSynchronize") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshModelOccSynchronize - -! Set a mesh size constraint on the entities `dimTags' in the OpenCASCADE CAD -! representation. Currently only entities of dimension 0 (points) are -! handled. - subroutine gmshModelOccMeshSetSize( - & dimTags, - & dimTags_n, - & size, - & ierr) - & bind(C, name = "gmshModelOccMeshSetSize") - use, intrinsic :: iso_c_binding - integer(c_int)::dimTags(*) - integer(c_size_t), value :: dimTags_n - real(c_double), value::size - integer(c_int)::ierr - end subroutine gmshModelOccMeshSetSize - -! Add a new post-processing view, with name `name'. If `tag' is positive use -! it (and remove the view with that tag if it already exists), otherwise -! associate a new tag. Return the view tag. - function gmshViewAdd( - & name, - & tag, - & ierr) - & bind(C, name = "gmshViewAdd") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshViewAdd - character(len = 1, kind = c_char)::name(*) - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshViewAdd - -! Remove the view with tag `tag'. - subroutine gmshViewRemove( - & tag, - & ierr) - & bind(C, name = "gmshViewRemove") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - integer(c_int)::ierr - end subroutine gmshViewRemove - -! Get the index of the view with tag `tag' in the list of currently loaded -! views. This dynamic index (it can change when views are removed) is used to -! access view options. - function gmshViewGetIndex( - & tag, - & ierr) - & bind(C, name = "gmshViewGetIndex") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshViewGetIndex - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshViewGetIndex - -! Get the tags of all views. - subroutine gmshViewGetTags( - & tags, - & tags_n, - & ierr) - & bind(C, name = "gmshViewGetTags") - use, intrinsic :: iso_c_binding - type(c_ptr), intent(out)::tags - integer(c_size_t) :: tags_n - integer(c_int)::ierr - end subroutine gmshViewGetTags - -! Add model-based post-processing data to the view with tag `tag'. -! `modelName' identifies the model the data is attached to. `dataType' -! specifies the type of data, currently either "NodeData", "ElementData" or -! "ElementNodeData". `step' specifies the identifier (>= 0) of the data in a -! sequence. `tags' gives the tags of the nodes or elements in the mesh to -! which the data is associated. `data' is a vector of the same length as -! `tags': each entry is the vector of double precision numbers representing -! the data associated with the corresponding tag. The optional `time' -! argument associate a time value with the data. `numComponents' gives the -! number of data components (1 for scalar data, 3 for vector data, etc.) per -! entity; if negative, it is automatically inferred (when possible) from the -! input data. `partition' allows one to specify data in several sub-sets. - subroutine gmshViewAddModelData( - & tag, - & step, - & modelName, - & dataType, - & tags, - & tags_n, - & data, - & data_n, - & data_nn, - & time, - & numComponents, - & partition, - & ierr) - & bind(C, name = "gmshViewAddModelData") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - integer(c_int), value::step - character(len = 1, kind = c_char)::modelName(*) - character(len = 1, kind = c_char)::dataType(*) - integer(c_size_t)::tags(*) - integer(c_size_t), value :: tags_n - type(c_ptr), intent(out)::data - type(c_ptr), intent(out) :: data_n - integer(c_size_t) :: data_nn - real(c_double), value::time - integer(c_int), value::numComponents - integer(c_int), value::partition - integer(c_int)::ierr - end subroutine gmshViewAddModelData - -! Add homogeneous model-based post-processing data to the view with tag -! `tag'. The arguments have the same meaning as in `addModelData', except -! that `data' is supposed to be homogeneous and is thus flattened in a single -! vector. For data types that can lead to different data sizes per tag (like -! "ElementNodeData"), the data should be padded. - subroutine gmshViewAddHomogeneousModelData( - & tag, - & step, - & modelName, - & dataType, - & tags, - & tags_n, - & data, - & data_n, - & time, - & numComponents, - & partition, - & ierr) - & bind(C, name = "gmshViewAddHomogeneousModelData") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - integer(c_int), value::step - character(len = 1, kind = c_char)::modelName(*) - character(len = 1, kind = c_char)::dataType(*) - integer(c_size_t)::tags(*) - integer(c_size_t), value :: tags_n - real(c_double)::data(*) - integer(c_size_t), value :: data_n - real(c_double), value::time - integer(c_int), value::numComponents - integer(c_int), value::partition - integer(c_int)::ierr - end subroutine gmshViewAddHomogeneousModelData - -! Get model-based post-processing data from the view with tag `tag' at step -! `step'. Return the `data' associated to the nodes or the elements with tags -! `tags', as well as the `dataType' and the number of components -! `numComponents'. - subroutine gmshViewGetModelData( - & tag, - & step, - & dataType, - & tags, - & tags_n, - & data, - & data_n, - & data_nn, - & time, - & numComponents, - & ierr) - & bind(C, name = "gmshViewGetModelData") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - integer(c_int), value::step - type(c_ptr)::dataType(*) - type(c_ptr), intent(out)::tags - integer(c_size_t) :: tags_n - type (c_ptr), intent(out)::data - type(c_ptr), intent(out) :: data_n - integer (c_size_t) :: data_nn - real(c_double)::time - integer(c_int)::numComponents - integer(c_int)::ierr - end subroutine gmshViewGetModelData - -! Get homogeneous model-based post-processing data from the view with tag -! `tag' at step `step'. The arguments have the same meaning as in -! `getModelData', except that `data' is returned flattened in a single -! vector, with the appropriate padding if necessary. - subroutine gmshViewGetHomogeneousModelData( - & tag, - & step, - & dataType, - & tags, - & tags_n, - & data, - & data_n, - & time, - & numComponents, - & ierr) - & bind(C, name = "gmshViewGetHomogeneousModelData") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - integer(c_int), value::step - type(c_ptr)::dataType(*) - type(c_ptr), intent(out)::tags - integer(c_size_t) :: tags_n - type(c_ptr), intent(out)::data - integer(c_size_t) :: data_n - real(c_double)::time - integer(c_int)::numComponents - integer(c_int)::ierr - end subroutine gmshViewGetHomogeneousModelData - -! Add list-based post-processing data to the view with tag `tag'. List-based -! datasets are independent from any model and any mesh. `dataType' identifies -! the data by concatenating the field type ("S" for scalar, "V" for vector, -! "T" for tensor) and the element type ("P" for point, "L" for line, "T" for -! triangle, "S" for tetrahedron, "I" for prism, "H" for hexaHedron, "Y" for -! pyramid). For example `dataType' should be "ST" for a scalar field on -! triangles. `numEle' gives the number of elements in the data. `data' -! contains the data for the `numEle' elements, concatenated, with node -! coordinates followed by values per node, repeated for each step: [e1x1, -! ..., e1xn, e1y1, ..., e1yn, e1z1, ..., e1zn, e1v1..., e1vN, e2x1, ...]. - subroutine gmshViewAddListData( - & tag, - & dataType, - & numEle, - & data, - & data_n, - & ierr) - & bind(C, name = "gmshViewAddListData") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - character(len = 1, kind = c_char)::dataType(*) - integer(c_int), value::numEle - real(c_double)::data(*) - integer(c_size_t), value :: data_n - integer(c_int)::ierr - end subroutine gmshViewAddListData - -! Get list-based post-processing data from the view with tag `tag'. Return -! the types `dataTypes', the number of elements `numElements' for each data -! type and the `data' for each data type. - subroutine gmshViewGetListData( - & tag, - & dataType, - & dataType_n, - & numElements, - & numElements_n, - & data, - & data_n, - & data_nn, - & ierr) - & bind(C, name = "gmshViewGetListData") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - type(c_ptr), intent(out)::dataType - integer(c_size_t) :: dataType_n - type(c_ptr), intent(out)::numElements - integer(c_size_t) :: numElements_n - type (c_ptr), intent(out)::data - type(c_ptr), intent(out) :: data_n - integer (c_size_t) :: data_nn - integer(c_int)::ierr - end subroutine gmshViewGetListData - -! Add a string to a list-based post-processing view with tag `tag'. If -! `coord' contains 3 coordinates the string is positioned in the 3D model -! space ("3D string"); if it contains 2 coordinates it is positioned in the -! 2D graphics viewport ("2D string"). `data' contains one or more (for -! multistep views) strings. `style' contains key-value pairs of styling -! parameters, concatenated. Available keys are "Font" (possible values: -! "Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic", -! "Helvetica", "Helvetica-Bold", "Helvetica-Oblique", "Helvetica- -! BoldOblique", "Courier", "Courier-Bold", "Courier-Oblique", "Courier- -! BoldOblique", "Symbol", "ZapfDingbats", "Screen"), "FontSize" and "Align" -! (possible values: "Left" or "BottomLeft", "Center" or "BottomCenter", -! "Right" or "BottomRight", "TopLeft", "TopCenter", "TopRight", "CenterLeft", -! "CenterCenter", "CenterRight"). - subroutine gmshViewAddListDataString( - & tag, - & coord, - & coord_n, - & data, - & data_n, - & style, - & style_n, - & ierr) - & bind(C, name = "gmshViewAddListDataString") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - real(c_double)::coord(*) - integer(c_size_t), value :: coord_n - type(c_ptr)::data(*) - integer(c_size_t), value :: data_n - type(c_ptr)::style(*) - integer(c_size_t), value :: style_n - integer(c_int)::ierr - end subroutine gmshViewAddListDataString - -! Get list-based post-processing data strings (2D strings if `dim' = 2, 3D -! strings if `dim' = 3) from the view with tag `tag'. Return the coordinates -! in `coord', the strings in `data' and the styles in `style'. - subroutine gmshViewGetListDataStrings( - & tag, - & dim, - & coord, - & coord_n, - & data, - & data_n, - & style, - & style_n, - & ierr) - & bind(C, name = "gmshViewGetListDataStrings") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - integer(c_int), value::dim - type(c_ptr), intent(out)::coord - integer(c_size_t) :: coord_n - type(c_ptr), intent(out)::data - integer(c_size_t) :: data_n - type(c_ptr), intent(out)::style - integer(c_size_t) :: style_n - integer(c_int)::ierr - end subroutine gmshViewGetListDataStrings - -! Set interpolation matrices for the element family `type' ("Line", -! "Triangle", "Quadrangle", "Tetrahedron", "Hexahedron", "Prism", "Pyramid") -! in the view `tag'. The approximation of the values over an element is -! written as a linear combination of `d' basis functions f_i(u, v, w) = -! sum_(j = 0, ..., `d' - 1) `coef'[i][j] u^`exp'[j][0] v^`exp'[j][1] -! w^`exp'[j][2], i = 0, ..., `d'-1, with u, v, w the coordinates in the -! reference element. The `coef' matrix (of size `d' x `d') and the `exp' -! matrix (of size `d' x 3) are stored as vectors, by row. If `dGeo' is -! positive, use `coefGeo' and `expGeo' to define the interpolation of the x, -! y, z coordinates of the element in terms of the u, v, w coordinates, in -! exactly the same way. If `d' < 0, remove the interpolation matrices. - subroutine gmshViewSetInterpolationMatrices( - & tag, - & type, - & d, - & coef, - & coef_n, - & exp, - & exp_n, - & dGeo, - & coefGeo, - & coefGeo_n, - & expGeo, - & expGeo_n, - & ierr) - & bind(C, name = "gmshViewSetInterpolationMatrices") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - character(len = 1, kind = c_char)::type(*) - integer(c_int), value::d - real(c_double)::coef(*) - integer(c_size_t), value :: coef_n - real(c_double)::exp(*) - integer(c_size_t), value :: exp_n - integer(c_int), value::dGeo - real(c_double)::coefGeo(*) - integer(c_size_t), value :: coefGeo_n - real(c_double)::expGeo(*) - integer(c_size_t), value :: expGeo_n - integer(c_int)::ierr - end subroutine gmshViewSetInterpolationMatrices - -! Add a post-processing view as an `alias' of the reference view with tag -! `refTag'. If `copyOptions' is set, copy the options of the reference view. -! If `tag' is positive use it (and remove the view with that tag if it -! already exists), otherwise associate a new tag. Return the view tag. - function gmshViewAddAlias( - & refTag, - & copyOptions, - & tag, - & ierr) - & bind(C, name = "gmshViewAddAlias") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshViewAddAlias - integer(c_int), value::refTag - integer(c_int), value::copyOptions - integer(c_int), value::tag - integer(c_int)::ierr - end function gmshViewAddAlias - -! Combine elements (if `what' == "elements") or steps (if `what' == "steps") -! of all views (`how' == "all"), all visible views (`how' == "visible") or -! all views having the same name (`how' == "name"). Remove original views if -! `remove' is set. - subroutine gmshViewCombine( - & what, - & how, - & remove, - & copyOptions, - & ierr) - & bind(C, name = "gmshViewCombine") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::what(*) - character(len = 1, kind = c_char)::how(*) - integer(c_int), value::remove - integer(c_int), value::copyOptions - integer(c_int)::ierr - end subroutine gmshViewCombine - -! Probe the view `tag' for its `value' at point (`x', `y', `z'). If no match -! is found, `value' is returned empty. Return only the value at step `step' -! is `step' is positive. Return only values with `numComp' if `numComp' is -! positive. Return the gradient of the `value' if `gradient' is set. If -! `distanceMax' is zero, only return a result if an exact match inside an -! element in the view is found; if `distanceMax' is positive and an exact -! match is not found, return the value at the closest node if it is closer -! than `distanceMax'; if `distanceMax' is negative and an exact match is not -! found, always return the value at the closest node. The distance to the -! match is returned in `distance'. Return the result from the element -! described by its coordinates if `xElementCoord', `yElementCoord' and -! `zElementCoord' are provided. If `dim' is >= 0, return only matches from -! elements of the specified dimension. - subroutine gmshViewProbe( - & tag, - & x, - & y, - & z, - & value, - & value_n, - & distance, - & step, - & numComp, - & gradient, - & distanceMax, - & xElemCoord, - & xElemCoord_n, - & yElemCoord, - & yElemCoord_n, - & zElemCoord, - & zElemCoord_n, - & dim, - & ierr) - & bind(C, name = "gmshViewProbe") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - real(c_double), value::x - real(c_double), value::y - real(c_double), value::z - type(c_ptr), intent(out)::value - integer(c_size_t) :: value_n - real(c_double)::distance - integer(c_int), value::step - integer(c_int), value::numComp - integer(c_int), value::gradient - real(c_double), value::distanceMax - real(c_double)::xElemCoord(*) - integer(c_size_t), value :: xElemCoord_n - real(c_double)::yElemCoord(*) - integer(c_size_t), value :: yElemCoord_n - real(c_double)::zElemCoord(*) - integer(c_size_t), value :: zElemCoord_n - integer(c_int), value::dim - integer(c_int)::ierr - end subroutine gmshViewProbe - -! Write the view to a file `fileName'. The export format is determined by the -! file extension. Append to the file if `append' is set. - subroutine gmshViewWrite( - & tag, - & fileName, - & append, - & ierr) - & bind(C, name = "gmshViewWrite") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - character(len = 1, kind = c_char)::fileName(*) - integer(c_int), value::append - integer(c_int)::ierr - end subroutine gmshViewWrite - -! Set the global visibility of the view `tag' per window to `value', where -! `windowIndex' identifies the window in the window list. - subroutine gmshViewSetVisibilityPerWindow( - & tag, - & value, - & windowIndex, - & ierr) - & bind(C, name = "gmshViewSetVisibilityPerWindow") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - integer(c_int), value::value - integer(c_int), value::windowIndex - integer(c_int)::ierr - end subroutine gmshViewSetVisibilityPerWindow - -! Set the numerical option `name' to value `value' for the view with tag -! `tag'. - subroutine gmshViewOptionSetNumber( - & tag, - & name, - & value, - & ierr) - & bind(C, name = "gmshViewOptionSetNumber") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - character(len = 1, kind = c_char)::name(*) - real(c_double), value::value - integer(c_int)::ierr - end subroutine gmshViewOptionSetNumber - -! Get the `value' of the numerical option `name' for the view with tag `tag'. - subroutine gmshViewOptionGetNumber( - & tag, - & name, - & value, - & ierr) - & bind(C, name = "gmshViewOptionGetNumber") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - character(len = 1, kind = c_char)::name(*) - real(c_double)::value - integer(c_int)::ierr - end subroutine gmshViewOptionGetNumber - -! Set the string option `name' to value `value' for the view with tag `tag'. - subroutine gmshViewOptionSetString( - & tag, - & name, - & value, - & ierr) - & bind(C, name = "gmshViewOptionSetString") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - character(len = 1, kind = c_char)::name(*) - character(len = 1, kind = c_char)::value(*) - integer(c_int)::ierr - end subroutine gmshViewOptionSetString - -! Get the `value' of the string option `name' for the view with tag `tag'. - subroutine gmshViewOptionGetString( - & tag, - & name, - & value, - & ierr) - & bind(C, name = "gmshViewOptionGetString") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - character(len = 1, kind = c_char)::name(*) - type(c_ptr)::value(*) - integer(c_int)::ierr - end subroutine gmshViewOptionGetString - -! Set the color option `name' to the RGBA value (`r', `g', `b', `a') for the -! view with tag `tag', where where `r', `g', `b' and `a' should be integers -! between 0 and 255. - subroutine gmshViewOptionSetColor( - & tag, - & name, - & r, - & g, - & b, - & a, - & ierr) - & bind(C, name = "gmshViewOptionSetColor") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - character(len = 1, kind = c_char)::name(*) - integer(c_int), value::r - integer(c_int), value::g - integer(c_int), value::b - integer(c_int), value::a - integer(c_int)::ierr - end subroutine gmshViewOptionSetColor - -! Get the `r', `g', `b', `a' value of the color option `name' for the view -! with tag `tag'. - subroutine gmshViewOptionGetColor( - & tag, - & name, - & r, - & g, - & b, - & a, - & ierr) - & bind(C, name = "gmshViewOptionGetColor") - use, intrinsic :: iso_c_binding - integer(c_int), value::tag - character(len = 1, kind = c_char)::name(*) - integer(c_int)::r - integer(c_int)::g - integer(c_int)::b - integer(c_int)::a - integer(c_int)::ierr - end subroutine gmshViewOptionGetColor - -! Copy the options from the view with tag `refTag' to the view with tag -! `tag'. - subroutine gmshViewOptionCopy( - & refTag, - & tag, - & ierr) - & bind(C, name = "gmshViewOptionCopy") - use, intrinsic :: iso_c_binding - integer(c_int), value::refTag - integer(c_int), value::tag - integer(c_int)::ierr - end subroutine gmshViewOptionCopy - -! Set the numerical option `option' to the value `value' for plugin `name'. - subroutine gmshPluginSetNumber( - & name, - & option, - & value, - & ierr) - & bind(C, name = "gmshPluginSetNumber") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - character(len = 1, kind = c_char)::option(*) - real(c_double), value::value - integer(c_int)::ierr - end subroutine gmshPluginSetNumber - -! Set the string option `option' to the value `value' for plugin `name'. - subroutine gmshPluginSetString( - & name, - & option, - & value, - & ierr) - & bind(C, name = "gmshPluginSetString") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - character(len = 1, kind = c_char)::option(*) - character(len = 1, kind = c_char)::value(*) - integer(c_int)::ierr - end subroutine gmshPluginSetString - -! Run the plugin `name'. Return the tag of the created view (if any). - function gmshPluginRun( - & name, - & ierr) - & bind(C, name = "gmshPluginRun") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshPluginRun - character(len = 1, kind = c_char)::name(*) - integer(c_int)::ierr - end function gmshPluginRun - -! Draw all the OpenGL scenes. - subroutine gmshGraphicsDraw( - & ierr) - & bind(C, name = "gmshGraphicsDraw") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshGraphicsDraw - -! Create the FLTK graphical user interface. Can only be called in the main -! thread. - subroutine gmshFltkInitialize( - & ierr) - & bind(C, name = "gmshFltkInitialize") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshFltkInitialize - -! Close the FLTK graphical user interface. Can only be called in the main -! thread. - subroutine gmshFltkFinalize( - & ierr) - & bind(C, name = "gmshFltkFinalize") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshFltkFinalize - -! Wait at most `time' seconds for user interface events and return. If `time' -! < 0, wait indefinitely. First automatically create the user interface if it -! has not yet been initialized. Can only be called in the main thread. - subroutine gmshFltkWait( - & time, - & ierr) - & bind(C, name = "gmshFltkWait") - use, intrinsic :: iso_c_binding - real(c_double), value::time - integer(c_int)::ierr - end subroutine gmshFltkWait - -! Update the user interface (potentially creating new widgets and windows). -! First automatically create the user interface if it has not yet been -! initialized. Can only be called in the main thread: use `awake("update")' -! to trigger an update of the user interface from another thread. - subroutine gmshFltkUpdate( - & ierr) - & bind(C, name = "gmshFltkUpdate") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshFltkUpdate - -! Awake the main user interface thread and process pending events, and -! optionally perform an action (currently the only `action' allowed is -! "update"). - subroutine gmshFltkAwake( - & action, - & ierr) - & bind(C, name = "gmshFltkAwake") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::action(*) - integer(c_int)::ierr - end subroutine gmshFltkAwake - -! Block the current thread until it can safely modify the user interface. - subroutine gmshFltkLock( - & ierr) - & bind(C, name = "gmshFltkLock") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshFltkLock - -! Release the lock that was set using lock. - subroutine gmshFltkUnlock( - & ierr) - & bind(C, name = "gmshFltkUnlock") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshFltkUnlock - -! Run the event loop of the graphical user interface, i.e. repeatedly call -! `wait()'. First automatically create the user interface if it has not yet -! been initialized. Can only be called in the main thread. - subroutine gmshFltkRun( - & ierr) - & bind(C, name = "gmshFltkRun") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshFltkRun - -! Check if the user interface is available (e.g. to detect if it has been -! closed). - function gmshFltkIsAvailable( - & ierr) - & bind(C, name = "gmshFltkIsAvailable") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshFltkIsAvailable - integer(c_int)::ierr - end function gmshFltkIsAvailable - -! Select entities in the user interface. If `dim' is >= 0, return only the -! entities of the specified dimension (e.g. points if `dim' == 0). - function gmshFltkSelectEntities( - & dimTags, - & dimTags_n, - & dim, - & ierr) - & bind(C, name = "gmshFltkSelectEntities") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshFltkSelectEntities - type(c_ptr), intent(out)::dimTags - integer(c_size_t) :: dimTags_n - integer(c_int), value::dim - integer(c_int)::ierr - end function gmshFltkSelectEntities - -! Select elements in the user interface. - function gmshFltkSelectElements( - & elementTags, - & elementTags_n, - & ierr) - & bind(C, name = "gmshFltkSelectElements") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshFltkSelectElements - type(c_ptr), intent(out)::elementTags - integer(c_size_t) :: elementTags_n - integer(c_int)::ierr - end function gmshFltkSelectElements - -! Select views in the user interface. - function gmshFltkSelectViews( - & viewTags, - & viewTags_n, - & ierr) - & bind(C, name = "gmshFltkSelectViews") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshFltkSelectViews - type(c_ptr), intent(out)::viewTags - integer(c_size_t) :: viewTags_n - integer(c_int)::ierr - end function gmshFltkSelectViews - -! Split the current window horizontally (if `how' = "h") or vertically (if -! `how' = "v"), using ratio `ratio'. If `how' = "u", restore a single window. - subroutine gmshFltkSplitCurrentWindow( - & how, - & ratio, - & ierr) - & bind(C, name = "gmshFltkSplitCurrentWindow") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::how(*) - real(c_double), value::ratio - integer(c_int)::ierr - end subroutine gmshFltkSplitCurrentWindow - -! Set the current window by speficying its index (starting at 0) in the list -! of all windows. When new windows are created by splits, new windows are -! appended at the end of the list. - subroutine gmshFltkSetCurrentWindow( - & windowIndex, - & ierr) - & bind(C, name = "gmshFltkSetCurrentWindow") - use, intrinsic :: iso_c_binding - integer(c_int), value::windowIndex - integer(c_int)::ierr - end subroutine gmshFltkSetCurrentWindow - -! Set a status message in the current window. If `graphics' is set, display -! the message inside the graphic window instead of the status bar. - subroutine gmshFltkSetStatusMessage( - & message, - & graphics, - & ierr) - & bind(C, name = "gmshFltkSetStatusMessage") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::message(*) - integer(c_int), value::graphics - integer(c_int)::ierr - end subroutine gmshFltkSetStatusMessage - -! Show context window for the entity of dimension `dim' and tag `tag'. - subroutine gmshFltkShowContextWindow( - & dim, - & tag, - & ierr) - & bind(C, name = "gmshFltkShowContextWindow") - use, intrinsic :: iso_c_binding - integer(c_int), value::dim - integer(c_int), value::tag - integer(c_int)::ierr - end subroutine gmshFltkShowContextWindow - -! Open the `name' item in the menu tree. - subroutine gmshFltkOpenTreeItem( - & name, - & ierr) - & bind(C, name = "gmshFltkOpenTreeItem") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - integer(c_int)::ierr - end subroutine gmshFltkOpenTreeItem - -! Close the `name' item in the menu tree. - subroutine gmshFltkCloseTreeItem( - & name, - & ierr) - & bind(C, name = "gmshFltkCloseTreeItem") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - integer(c_int)::ierr - end subroutine gmshFltkCloseTreeItem - -! Get the names of the variables in the Gmsh parser matching the `search' -! regular expression. If `search' is empty, return all the names. - subroutine gmshParserGetNames( - & names, - & names_n, - & search, - & ierr) - & bind(C, name = "gmshParserGetNames") - use, intrinsic :: iso_c_binding - type(c_ptr), intent(out)::names - integer(c_size_t) :: names_n - character(len = 1, kind = c_char)::search(*) - integer(c_int)::ierr - end subroutine gmshParserGetNames - -! Set the value of the number variable `name' in the Gmsh parser. Create the -! variable if it does not exist; update the value if the variable exists. - subroutine gmshParserSetNumber( - & name, - & value, - & value_n, - & ierr) - & bind(C, name = "gmshParserSetNumber") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - real(c_double)::value(*) - integer(c_size_t), value :: value_n - integer(c_int)::ierr - end subroutine gmshParserSetNumber - -! Set the value of the string variable `name' in the Gmsh parser. Create the -! variable if it does not exist; update the value if the variable exists. - subroutine gmshParserSetString( - & name, - & value, - & value_n, - & ierr) - & bind(C, name = "gmshParserSetString") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - type(c_ptr)::value(*) - integer(c_size_t), value :: value_n - integer(c_int)::ierr - end subroutine gmshParserSetString - -! Get the value of the number variable `name' from the Gmsh parser. Return an -! empty vector if the variable does not exist. - subroutine gmshParserGetNumber( - & name, - & value, - & value_n, - & ierr) - & bind(C, name = "gmshParserGetNumber") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - type(c_ptr), intent(out)::value - integer(c_size_t) :: value_n - integer(c_int)::ierr - end subroutine gmshParserGetNumber - -! Get the value of the string variable `name' from the Gmsh parser. Return an -! empty vector if the variable does not exist. - subroutine gmshParserGetString( - & name, - & value, - & value_n, - & ierr) - & bind(C, name = "gmshParserGetString") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - type(c_ptr), intent(out)::value - integer(c_size_t) :: value_n - integer(c_int)::ierr - end subroutine gmshParserGetString - -! Clear all the Gmsh parser variables, or remove a single variable if `name' -! is given. - subroutine gmshParserClear( - & name, - & ierr) - & bind(C, name = "gmshParserClear") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - integer(c_int)::ierr - end subroutine gmshParserClear - -! Parse the file `fileName' with the Gmsh parser. - subroutine gmshParserParse( - & fileName, - & ierr) - & bind(C, name = "gmshParserParse") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::fileName(*) - integer(c_int)::ierr - end subroutine gmshParserParse - -! Set one or more parameters in the ONELAB database, encoded in `format'. - subroutine gmshOnelabSet( - & data, - & format, - & ierr) - & bind(C, name = "gmshOnelabSet") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::data(*) - character(len = 1, kind = c_char)::format(*) - integer(c_int)::ierr - end subroutine gmshOnelabSet - -! Get all the parameters (or a single one if `name' is specified) from the -! ONELAB database, encoded in `format'. - subroutine gmshOnelabGet( - & data, - & name, - & format, - & ierr) - & bind(C, name = "gmshOnelabGet") - use, intrinsic :: iso_c_binding - type(c_ptr)::data(*) - character(len = 1, kind = c_char)::name(*) - character(len = 1, kind = c_char)::format(*) - integer(c_int)::ierr - end subroutine gmshOnelabGet - -! Get the names of the parameters in the ONELAB database matching the -! `search' regular expression. If `search' is empty, return all the names. - subroutine gmshOnelabGetNames( - & names, - & names_n, - & search, - & ierr) - & bind(C, name = "gmshOnelabGetNames") - use, intrinsic :: iso_c_binding - type(c_ptr), intent(out)::names - integer(c_size_t) :: names_n - character(len = 1, kind = c_char)::search(*) - integer(c_int)::ierr - end subroutine gmshOnelabGetNames - -! Set the value of the number parameter `name' in the ONELAB database. Create -! the parameter if it does not exist; update the value if the parameter -! exists. - subroutine gmshOnelabSetNumber( - & name, - & value, - & value_n, - & ierr) - & bind(C, name = "gmshOnelabSetNumber") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - real(c_double)::value(*) - integer(c_size_t), value :: value_n - integer(c_int)::ierr - end subroutine gmshOnelabSetNumber - -! Set the value of the string parameter `name' in the ONELAB database. Create -! the parameter if it does not exist; update the value if the parameter -! exists. - subroutine gmshOnelabSetString( - & name, - & value, - & value_n, - & ierr) - & bind(C, name = "gmshOnelabSetString") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - type(c_ptr)::value(*) - integer(c_size_t), value :: value_n - integer(c_int)::ierr - end subroutine gmshOnelabSetString - -! Get the value of the number parameter `name' from the ONELAB database. -! Return an empty vector if the parameter does not exist. - subroutine gmshOnelabGetNumber( - & name, - & value, - & value_n, - & ierr) - & bind(C, name = "gmshOnelabGetNumber") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - type(c_ptr), intent(out)::value - integer(c_size_t) :: value_n - integer(c_int)::ierr - end subroutine gmshOnelabGetNumber - -! Get the value of the string parameter `name' from the ONELAB database. -! Return an empty vector if the parameter does not exist. - subroutine gmshOnelabGetString( - & name, - & value, - & value_n, - & ierr) - & bind(C, name = "gmshOnelabGetString") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - type(c_ptr), intent(out)::value - integer(c_size_t) :: value_n - integer(c_int)::ierr - end subroutine gmshOnelabGetString - -! Check if any parameters in the ONELAB database used by the client `name' -! have been changed. - function gmshOnelabGetChanged( - & name, - & ierr) - & bind(C, name = "gmshOnelabGetChanged") - use, intrinsic :: iso_c_binding - integer(c_int)::gmshOnelabGetChanged - character(len = 1, kind = c_char)::name(*) - integer(c_int)::ierr - end function gmshOnelabGetChanged - -! Set the changed flag to value `value' for all the parameters in the ONELAB -! database used by the client `name'. - subroutine gmshOnelabSetChanged( - & name, - & value, - & ierr) - & bind(C, name = "gmshOnelabSetChanged") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - integer(c_int), value::value - integer(c_int)::ierr - end subroutine gmshOnelabSetChanged - -! Clear the ONELAB database, or remove a single parameter if `name' is given. - subroutine gmshOnelabClear( - & name, - & ierr) - & bind(C, name = "gmshOnelabClear") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - integer(c_int)::ierr - end subroutine gmshOnelabClear - -! Run a ONELAB client. If `name' is provided, create a new ONELAB client with -! name `name' and executes `command'. If not, try to run a client that might -! be linked to the processed input files. - subroutine gmshOnelabRun( - & name, - & command, - & ierr) - & bind(C, name = "gmshOnelabRun") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::name(*) - character(len = 1, kind = c_char)::command(*) - integer(c_int)::ierr - end subroutine gmshOnelabRun - -! Write a `message'. `level' can be "info", "warning" or "error". - subroutine gmshLoggerWrite( - & message, - & level, - & ierr) - & bind(C, name = "gmshLoggerWrite") - use, intrinsic :: iso_c_binding - character(len = 1, kind = c_char)::message(*) - character(len = 1, kind = c_char)::level(*) - integer(c_int)::ierr - end subroutine gmshLoggerWrite - -! Start logging messages. - subroutine gmshLoggerStart( - & ierr) - & bind(C, name = "gmshLoggerStart") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshLoggerStart - -! Get logged messages. - subroutine gmshLoggerGet( - & log, - & log_n, - & ierr) - & bind(C, name = "gmshLoggerGet") - use, intrinsic :: iso_c_binding - type(c_ptr), intent(out)::log - integer(c_size_t) :: log_n - integer(c_int)::ierr - end subroutine gmshLoggerGet - -! Stop logging messages. - subroutine gmshLoggerStop( - & ierr) - & bind(C, name = "gmshLoggerStop") - use, intrinsic :: iso_c_binding - integer(c_int)::ierr - end subroutine gmshLoggerStop - -! Return wall clock time. - function gmshLoggerGetWallTime( - & ierr) - & bind(C, name = "gmshLoggerGetWallTime") - use, intrinsic :: iso_c_binding - real(c_double)::gmshLoggerGetWallTime - integer(c_int)::ierr - end function gmshLoggerGetWallTime - -! Return CPU time. - function gmshLoggerGetCpuTime( - & ierr) - & bind(C, name = "gmshLoggerGetCpuTime") - use, intrinsic :: iso_c_binding - real(c_double)::gmshLoggerGetCpuTime - integer(c_int)::ierr - end function gmshLoggerGetCpuTime - -! Return last error message, if any. - subroutine gmshLoggerGetLastError( - & error, - & ierr) - & bind(C, name = "gmshLoggerGetLastError") - use, intrinsic :: iso_c_binding - type(c_ptr)::error(*) - integer(c_int)::ierr - end subroutine gmshLoggerGetLastError - - end interface - end module gmsh_fortran - -!DEC$ ENDIF diff --git a/tutorials/fortran/t1.f b/tutorials/fortran/t1.f deleted file mode 100644 index 809e49c946e1eca8916a686d09d3f42559a64d65..0000000000000000000000000000000000000000 --- a/tutorials/fortran/t1.f +++ /dev/null @@ -1,79 +0,0 @@ -c --------------------------------------------------------------------------- -c -c Gmsh Fortran tutorial 1 -c -c Elementary entities (points, curves, surfaces), physical groups -c -c --------------------------------------------------------------------------- - - include "gmshf.h" - - program main - use, intrinsic :: iso_c_binding - use gmsh_fortran - - implicit none - integer(c_int) :: ierr, p4, argc, itmp, i, ps, status, len - real(c_double) :: lc - - integer(c_int) :: cl1(4) = (/4, 1, -2, 3/) - integer(c_int) :: s1(1) = (/1/) - integer(c_int) :: g5(3) = (/1, 2, 4/) - integer(c_int) :: g6(1) = (/1/) - - type(c_ptr), allocatable :: argv(:) - - type string - character(len = :, kind = c_char), allocatable :: item - end type string - type(string), allocatable, target :: tmp(:) - - character(80) :: buf - - lc = 1d - 2 - - argc = command_argument_count() - allocate(argv(argc + 2)) - allocate(tmp(argc + 1)) - - do i = 0, argc - call get_command_argument(i, buf, len) - tmp(i + 1) % item = buf(1 : len) // c_null_char - argv(i + 1) = c_loc(tmp(i + 1) % item) - enddo - argv(argc + 2) = c_null_ptr - - call gmshInitialize(argc + 1, argv, 1, 0, ierr) - - call gmshModelAdd("t1" // c_null_char, ierr) - itmp = gmshModelGeoAddPoint(0d0, 0d0, 0d0, lc, 1, ierr) - itmp = gmshModelGeoAddPoint(0.1d0, 0d0, 0d0, lc, 2, ierr) - itmp = gmshModelGeoAddPoint(0.1d0, 0.3d0, 0d0, lc, 3, ierr) - p4 = gmshModelGeoAddPoint(0d0, 0.3d0, 0d0, lc, -1, ierr) - - itmp = gmshModelGeoAddLine(1, 2, 1, ierr) - itmp = gmshModelGeoAddLine(3, 2, 2, ierr) - itmp = gmshModelGeoAddLine(3, p4, 3, ierr) - itmp = gmshModelGeoAddLine(p4, 1, 4, ierr) - - itmp = gmshModelGeoAddCurveLoop(cl1, 4_8, 1, 0, ierr) - itmp = gmshModelGeoAddPlaneSurface(s1, 1_8, 1, ierr) - - call gmshModelGeoSynchronize(ierr) - itmp = gmshModelAddPhysicalGroup(1, g5, 3_8, 5, ierr) - ps = gmshModelAddPhysicalGroup(2, g6, 1_8, -1, ierr) - call gmshModelSetPhysicalName(2, ps, "My surface" // c_null_char, - & ierr) - - call gmshModelMeshGenerate(2, ierr) - call gmshWrite("t1.msh" // c_null_char, ierr) - -c call gmshFltkRun(ierr) - - call gmshFinalize(ierr) - - deallocate(tmp) - deallocate(argv) - - stop - end diff --git a/tutorials/fortran/t1.f90 b/tutorials/fortran/t1.f90 new file mode 100644 index 0000000000000000000000000000000000000000..2f4f780d9a25f5281081f3cd0f1a2b572983f38b --- /dev/null +++ b/tutorials/fortran/t1.f90 @@ -0,0 +1,74 @@ +! --------------------------------------------------------------------------- +! +! Gmsh Fortran tutorial 1 +! +! Elementary entities (points, curves, surfaces), physical groups +! +! --------------------------------------------------------------------------- + +program main + use, intrinsic :: iso_c_binding + use gmsh + + implicit none + integer(c_int) :: ierr, p4, argc, itmp, i, ps, len + real(c_double) :: lc + + integer(c_int) :: cl1(4) = [4, 1, -2, 3] + integer(c_int) :: s1(1) = [1] + integer(c_int) :: g5(3) = [1, 2, 4] + integer(c_int) :: g6(1) = [1] + + type(c_ptr), allocatable :: argv(:) + + type string + character(len = :, kind = c_char), allocatable :: item + end type string + type(string), allocatable, target :: tmp(:) + + character(80) :: buf + + lc = 0.01 + + argc = command_argument_count() + allocate(argv(argc + 2)) + allocate(tmp(argc + 1)) + + do i = 0, argc + call get_command_argument(i, buf, len) + tmp(i + 1) % item = buf(1 : len) // c_null_char + argv(i + 1) = c_loc(tmp(i + 1) % item) + end do + argv(argc + 2) = c_null_ptr + + call gmshInitialize(argc + 1, argv, 1, 0, ierr) + + call gmshModelAdd("t1"//c_null_char, ierr) + itmp = gmshModelGeoAddPoint(0d0, 0d0, 0d0, lc, 1, ierr) + itmp = gmshModelGeoAddPoint(0.1d0, 0d0, 0d0, lc, 2, ierr) + itmp = gmshModelGeoAddPoint(0.1d0, 0.3d0, 0d0, lc, 3, ierr) + p4 = gmshModelGeoAddPoint(0d0, 0.3d0, 0d0, lc, -1, ierr) + + itmp = gmshModelGeoAddLine(1, 2, 1, ierr) + itmp = gmshModelGeoAddLine(3, 2, 2, ierr) + itmp = gmshModelGeoAddLine(3, p4, 3, ierr) + itmp = gmshModelGeoAddLine(p4, 1, 4, ierr) + + itmp = gmshModelGeoAddCurveLoop(cl1, 4_8, 1, 0, ierr) + itmp = gmshModelGeoAddPlaneSurface(s1, 1_8, 1, ierr) + + call gmshModelGeoSynchronize(ierr) + itmp = gmshModelAddPhysicalGroup(1, g5, 3_8, 5, "", ierr) + ps = gmshModelAddPhysicalGroup(2, g6, 1_8, -1, "", ierr) + call gmshModelSetPhysicalName(2, ps, "My surface"//c_null_char, ierr) + + call gmshModelMeshGenerate(2, ierr) + call gmshWrite("t1.msh" // c_null_char, ierr) + + ! call gmshFltkRun(ierr) + + call gmshFinalize(ierr) + + deallocate(tmp) + deallocate(argv) +end program main diff --git a/tutorials/fortran/t2.f b/tutorials/fortran/t2.f deleted file mode 100644 index 98457e5e8d64258590741257e08ca3f0d7ea7203..0000000000000000000000000000000000000000 --- a/tutorials/fortran/t2.f +++ /dev/null @@ -1,193 +0,0 @@ -c --------------------------------------------------------------------------- -c -c Gmsh Fortran tutorial 2 -c -c Transformations, extruded geometries, volumes -c -c --------------------------------------------------------------------------- - - include "gmshf.h" - - program main - use, intrinsic :: iso_c_binding - use gmsh_fortran - - implicit none - integer(c_int) :: ierr, argc, itmp, i, ps, status, len - integer(c_int) :: recombine - integer(c_size_t) :: ov_n, xyz_n, numElements_n, heights_n, ov2_n - real(c_double) :: lc - - integer(c_int) :: cl1(4) = (/4, 1, -2, 3/) - integer(c_int) :: cl2(4) = (/5, -8, -7, 3/) - integer(c_int) :: cl3(4) = (/115, -111, 3, 110/) - integer(c_int) :: cl4(4) = (/111, 116, -112, -7/) - integer(c_int) :: cl5(4) = (/112, 117, -113, -8/) - integer(c_int) :: cl6(4) = (/114, -110, 5, 113/) - integer(c_int) :: cl7(4) = (/115, 116, 117, 114/) - integer(c_int) :: s1(1) = (/1/) - integer(c_int) :: s2(1) = (/10/) - integer(c_int) :: s3(1) = (/118/) - integer(c_int) :: s4(1) = (/120/) - integer(c_int) :: s5(1) = (/122/) - integer(c_int) :: s6(1) = (/124/) - integer(c_int) :: s7(1) = (/126/) - integer(c_int) :: g5(3) = (/1, 2, 4/) - integer(c_int) :: g6(1) = (/1/) - integer(c_int) :: g7(2) = (/129, 130/) - integer(c_int) :: t(2) = (/0, 5/) - integer(c_int) :: iv(2) = (/0, 3/) - integer(c_int) :: iv2(4) = (/2, 1, 2, 11/) - integer(c_int) :: numElements(0) - real (c_double) :: iv0(0) - real(c_double) :: heights(0) - integer(c_int) :: sl1(6) = (/127, 119, 121, 123, 125, 11/) - integer(c_int) :: v1(1) = (/128/) - integer(c_int) :: ss(16) = - & (/0, 103, 0, 105, 0, 109, 0, 102, 0, 28, 0, 24, 0, 6, 0, 5/) - - type(c_ptr), allocatable :: argv(:) - type(c_ptr) :: ov, xyz, ov2, ov_3 - - type string - character(len = :, kind = c_char), allocatable :: item - end type string - type(string), allocatable, target :: tmp(:) - - character(80) :: buf - - integer(c_int), pointer :: pf_ov(:), pf_ov3(:), pf_ov2(:) - real(c_double), pointer :: pf_xyz(:) - - lc = 1d - 2 - - argc = command_argument_count() - allocate(argv(argc + 2)) - allocate(tmp(argc + 1)) - - do i = 0, argc - call get_command_argument(i, buf, len) - tmp(i + 1) % item = buf(1 : len) // c_null_char - argv(i + 1) = c_loc(tmp(i + 1) % item) - enddo - argv(argc + 2) = c_null_ptr - - call gmshInitialize(argc + 1, argv, 1, 0, ierr) - - call gmshModelAdd("t2" // c_null_char, ierr) - - itmp = gmshModelGeoAddPoint(0d0, 0d0, 0d0, lc, 1, ierr) - itmp = gmshModelGeoAddPoint(0.1d0, 0d0, 0d0, lc, 2, ierr) - itmp = gmshModelGeoAddPoint(0.1d0, 0.3d0, 0d0, lc, 3, ierr) - itmp = gmshModelGeoAddPoint(0d0, 0.3d0, 0d0, lc, 4, ierr) - - itmp = gmshModelGeoAddLine(1, 2, 1, ierr) - itmp = gmshModelGeoAddLine(3, 2, 2, ierr) - itmp = gmshModelGeoAddLine(3, 4, 3, ierr) - itmp = gmshModelGeoAddLine(4, 1, 4, ierr) - - itmp = gmshModelGeoAddCurveLoop(cl1, 4_8, 1, 0, ierr) - itmp = gmshModelGeoAddPlaneSurface(s1, 1_8, 1, ierr) - - call gmshModelGeoSynchronize(ierr) - itmp = gmshModelAddPhysicalGroup(1, g5, 3_8, 5, ierr) - ps = gmshModelAddPhysicalGroup(2, g6, 1_8, -1, ierr) - call gmshModelSetPhysicalName(2, ps, "My surface" // c_null_char, - & ierr) - - itmp = gmshModelGeoAddPoint(0d0, 0.4d0, 0d0, lc, 5, ierr) - - itmp = gmshModelGeoAddLine(4, 5, 5, ierr) - - call gmshModelGeoTranslate(t, 2_8, -0.02d0, 0d0, 0d0, ierr) - - call gmshModelGeoRotate(t, 2_8, 0d0, 0.3d0, 0d0, 0d0, 0d0, 1d0, - & -M_PI / 4d0, ierr) - - call gmshModelGeoCopy(iv, 2_8, ov, ov_n, ierr) - - call c_f_pointer(ov, pf_ov, [ov_n]) - call gmshModelGeoTranslate(pf_ov, ov_n, 0d0, 0.05d0, 0d0, ierr) - - itmp = gmshModelGeoAddLine(3, pf_ov(2), 7, ierr) - itmp = gmshModelGeoAddLine(pf_ov(2), 5, 8, ierr) - - itmp = gmshModelGeoAddCurveLoop(cl2, 4_8, 10, 0, ierr) - itmp = gmshModelGeoAddPlaneSurface(s2, 1_8, 11, ierr) - - call gmshModelGeoCopy(iv2, 4_8, ov, ov_n, ierr) - - call c_f_pointer(ov, pf_ov, [ov_n]) - call gmshModelGeoTranslate(pf_ov, ov_n, 0.12d0, 0d0, 0d0, ierr) - - print *, "New surfaces ", pf_ov(2), " and ", pf_ov(4) - - itmp = gmshModelGeoAddPoint(0d0, 0.3d0, 0.12d0, lc, 100, ierr) - itmp = gmshModelGeoAddPoint(0.1d0, 0.3d0, 0.12d0, lc, 101, ierr) - itmp = gmshModelGeoAddPoint(0.1d0, 0.35d0, 0.12d0, lc, 102, ierr) - - call gmshModelGeoSynchronize(ierr) - - call gmshModelGetValue(0, 5, iv0, 0_8, xyz, xyz_n, ierr) - - call c_f_pointer(xyz, pf_xyz, [xyz_n]) - itmp = gmshModelGeoAddPoint(pf_xyz(1), pf_xyz(2), 0.12d0, lc, 103, - & ierr) - - itmp = gmshModelGeoAddLine(4, 100, 110, ierr) - itmp = gmshModelGeoAddLine(3, 101, 111, ierr) - itmp = gmshModelGeoAddLine(6, 102, 112, ierr); - itmp = gmshModelGeoAddLine(5, 103, 113, ierr) - itmp = gmshModelGeoAddLine(103, 100, 114, ierr) - itmp = gmshModelGeoAddLine(100, 101, 115, ierr) - itmp = gmshModelGeoAddLine(101, 102, 116, ierr) - itmp = gmshModelGeoAddLine(102, 103, 117, ierr) - - itmp = gmshModelGeoAddCurveLoop(cl3, 4_8, 118, 0, ierr) - itmp = gmshModelGeoAddPlaneSurface(s3, 1_8, 119, ierr) - - itmp = gmshModelGeoAddCurveLoop(cl4, 4_8, 120, 0, ierr) - itmp = gmshModelGeoAddPlaneSurface(s4, 1_8, 121, ierr) - - itmp = gmshModelGeoAddCurveLoop(cl5, 4_8, 122, 0, ierr) - itmp = gmshModelGeoAddPlaneSurface(s5, 1_8, 123, ierr) - - itmp = gmshModelGeoAddCurveLoop(cl6, 4_8, 124, 0, ierr) - itmp = gmshModelGeoAddPlaneSurface(s6, 1_8, 125, ierr) - - itmp = gmshModelGeoAddCurveLoop(cl7, 4_8, 126, 0, ierr) - itmp = gmshModelGeoAddPlaneSurface(s7, 1_8, 127, ierr) - - itmp = gmshModelGeoAddSurfaceLoop(sl1, 6_8, 128, ierr) - itmp = gmshModelGeoAddVolume(v1, 1_8, 129, ierr) - - numElements_n = 0 - heights_n = 0 - recombine=0 - ov_3 = c_loc(pf_ov(3)) - call c_f_pointer(ov_3, pf_ov3, [ov_n - 2]) - call gmshModelGeoExtrude(pf_ov3, 2_8, 0d0, 0d0, 0.12d0, - & ov2, ov2_n, numElements, numElements_n, - & heights, heights_n, recombine, ierr) - - call gmshModelGeoMeshSetSize(ss, 16_8, lc * 3, ierr) - - call gmshModelGeoSynchronize(ierr) - - itmp = gmshModelAddPhysicalGroup(3, g7, 2_8, 1, ierr) - - call gmshModelSetPhysicalName(3, 1, "The volume" // c_null_char, - & ierr) - - call gmshModelMeshGenerate(3, ierr) - call gmshWrite("t2.msh" // c_null_char, ierr) - -c call gmshFltkRun(ierr) - - call gmshFinalize(ierr) - - deallocate(tmp) - deallocate(argv) - - stop - end diff --git a/tutorials/fortran/t2.f90 b/tutorials/fortran/t2.f90 new file mode 100644 index 0000000000000000000000000000000000000000..90dc7fdf5d268caae8fdead30486a7b159a6d8bc --- /dev/null +++ b/tutorials/fortran/t2.f90 @@ -0,0 +1,185 @@ +! --------------------------------------------------------------------------- +! +! Gmsh Fortran tutorial 2 +! +! Transformations, extruded geometries, volumes +! +! --------------------------------------------------------------------------- + + +program main + use, intrinsic :: iso_c_binding + use gmsh + + implicit none + integer(c_int) :: ierr, argc, itmp, i, ps, len + integer(c_int) :: recombine + integer(c_size_t) :: ov_n, xyz_n, numElements_n, heights_n, ov2_n + real(c_double) :: lc + + integer(c_int) :: cl1(4) = [4, 1, -2, 3] + integer(c_int) :: cl2(4) = [5, -8, -7, 3] + integer(c_int) :: cl3(4) = [115, -111, 3, 110] + integer(c_int) :: cl4(4) = [111, 116, -112, -7] + integer(c_int) :: cl5(4) = [112, 117, -113, -8] + integer(c_int) :: cl6(4) = [114, -110, 5, 113] + integer(c_int) :: cl7(4) = [115, 116, 117, 114] + integer(c_int) :: s1(1) = [1] + integer(c_int) :: s2(1) = [10] + integer(c_int) :: s3(1) = [118] + integer(c_int) :: s4(1) = [120] + integer(c_int) :: s5(1) = [122] + integer(c_int) :: s6(1) = [124] + integer(c_int) :: s7(1) = [126] + integer(c_int) :: g5(3) = [1, 2, 4] + integer(c_int) :: g6(1) = [1] + integer(c_int) :: g7(2) = [129, 130] + integer(c_int) :: t(2) = [0, 5] + integer(c_int) :: iv(2) = [0, 3] + integer(c_int) :: iv2(4) = [2, 1, 2, 11] + integer(c_int) :: numElements(0) + real (c_double) :: iv0(0) + real(c_double) :: heights(0) + integer(c_int) :: sl1(6) = [127, 119, 121, 123, 125, 11] + integer(c_int) :: v1(1) = [128] + integer(c_int) :: ss(16) = [0, 103, 0, 105, 0, 109, 0, 102, 0, 28, 0, 24, 0, 6, 0, 5] + + type(c_ptr), allocatable :: argv(:) + type(c_ptr) :: ov, xyz, ov2, ov_3 + + type string + character(len = :, kind = c_char), allocatable :: item + end type string + type(string), allocatable, target :: tmp(:) + + character(80) :: buf + + integer(c_int), pointer :: pf_ov(:), pf_ov3(:) + real(c_double), pointer :: pf_xyz(:) + + lc = 0.01 + + argc = command_argument_count() + allocate(argv(argc + 2)) + allocate(tmp(argc + 1)) + + do i = 0, argc + call get_command_argument(i, buf, len) + tmp(i + 1) % item = buf(1 : len) // c_null_char + argv(i + 1) = c_loc(tmp(i + 1) % item) + enddo + argv(argc + 2) = c_null_ptr + + call gmshInitialize(argc + 1, argv, 1, 0, ierr) + + call gmshModelAdd("t2" // c_null_char, ierr) + + itmp = gmshModelGeoAddPoint(0d0, 0d0, 0d0, lc, 1, ierr) + itmp = gmshModelGeoAddPoint(0.1d0, 0d0, 0d0, lc, 2, ierr) + itmp = gmshModelGeoAddPoint(0.1d0, 0.3d0, 0d0, lc, 3, ierr) + itmp = gmshModelGeoAddPoint(0d0, 0.3d0, 0d0, lc, 4, ierr) + + itmp = gmshModelGeoAddLine(1, 2, 1, ierr) + itmp = gmshModelGeoAddLine(3, 2, 2, ierr) + itmp = gmshModelGeoAddLine(3, 4, 3, ierr) + itmp = gmshModelGeoAddLine(4, 1, 4, ierr) + + itmp = gmshModelGeoAddCurveLoop(cl1, 4_8, 1, 0, ierr) + itmp = gmshModelGeoAddPlaneSurface(s1, 1_8, 1, ierr) + + call gmshModelGeoSynchronize(ierr) + itmp = gmshModelAddPhysicalGroup(1, g5, 3_8, 5, "", ierr) + ps = gmshModelAddPhysicalGroup(2, g6, 1_8, -1, "", ierr) + call gmshModelSetPhysicalName(2, ps, "My surface" // c_null_char, ierr) + + itmp = gmshModelGeoAddPoint(0d0, 0.4d0, 0d0, lc, 5, ierr) + + itmp = gmshModelGeoAddLine(4, 5, 5, ierr) + + call gmshModelGeoTranslate(t, 2_8, -0.02d0, 0d0, 0d0, ierr) + + call gmshModelGeoRotate(t, 2_8, 0d0, 0.3d0, 0d0, 0d0, 0d0, 1d0, -M_PI / 4d0, ierr) + + call gmshModelGeoCopy(iv, 2_8, ov, ov_n, ierr) + + call c_f_pointer(ov, pf_ov, [ov_n]) + call gmshModelGeoTranslate(pf_ov, ov_n, 0d0, 0.05d0, 0d0, ierr) + + itmp = gmshModelGeoAddLine(3, pf_ov(2), 7, ierr) + itmp = gmshModelGeoAddLine(pf_ov(2), 5, 8, ierr) + + itmp = gmshModelGeoAddCurveLoop(cl2, 4_8, 10, 0, ierr) + itmp = gmshModelGeoAddPlaneSurface(s2, 1_8, 11, ierr) + + call gmshModelGeoCopy(iv2, 4_8, ov, ov_n, ierr) + + call c_f_pointer(ov, pf_ov, [ov_n]) + call gmshModelGeoTranslate(pf_ov, ov_n, 0.12d0, 0d0, 0d0, ierr) + + print *, "New surfaces ", pf_ov(2), " and ", pf_ov(4) + + itmp = gmshModelGeoAddPoint(0d0, 0.3d0, 0.12d0, lc, 100, ierr) + itmp = gmshModelGeoAddPoint(0.1d0, 0.3d0, 0.12d0, lc, 101, ierr) + itmp = gmshModelGeoAddPoint(0.1d0, 0.35d0, 0.12d0, lc, 102, ierr) + + call gmshModelGeoSynchronize(ierr) + + call gmshModelGetValue(0, 5, iv0, 0_8, xyz, xyz_n, ierr) + + call c_f_pointer(xyz, pf_xyz, [xyz_n]) + itmp = gmshModelGeoAddPoint(pf_xyz(1), pf_xyz(2), 0.12d0, lc, 103, ierr) + + itmp = gmshModelGeoAddLine(4, 100, 110, ierr) + itmp = gmshModelGeoAddLine(3, 101, 111, ierr) + itmp = gmshModelGeoAddLine(6, 102, 112, ierr); + itmp = gmshModelGeoAddLine(5, 103, 113, ierr) + itmp = gmshModelGeoAddLine(103, 100, 114, ierr) + itmp = gmshModelGeoAddLine(100, 101, 115, ierr) + itmp = gmshModelGeoAddLine(101, 102, 116, ierr) + itmp = gmshModelGeoAddLine(102, 103, 117, ierr) + + itmp = gmshModelGeoAddCurveLoop(cl3, 4_8, 118, 0, ierr) + itmp = gmshModelGeoAddPlaneSurface(s3, 1_8, 119, ierr) + + itmp = gmshModelGeoAddCurveLoop(cl4, 4_8, 120, 0, ierr) + itmp = gmshModelGeoAddPlaneSurface(s4, 1_8, 121, ierr) + + itmp = gmshModelGeoAddCurveLoop(cl5, 4_8, 122, 0, ierr) + itmp = gmshModelGeoAddPlaneSurface(s5, 1_8, 123, ierr) + + itmp = gmshModelGeoAddCurveLoop(cl6, 4_8, 124, 0, ierr) + itmp = gmshModelGeoAddPlaneSurface(s6, 1_8, 125, ierr) + + itmp = gmshModelGeoAddCurveLoop(cl7, 4_8, 126, 0, ierr) + itmp = gmshModelGeoAddPlaneSurface(s7, 1_8, 127, ierr) + + itmp = gmshModelGeoAddSurfaceLoop(sl1, 6_8, 128, ierr) + itmp = gmshModelGeoAddVolume(v1, 1_8, 129, ierr) + + numElements_n = 0 + heights_n = 0 + recombine=0 + ov_3 = c_loc(pf_ov(3)) + call c_f_pointer(ov_3, pf_ov3, [ov_n - 2]) + call gmshModelGeoExtrude(pf_ov3, 2_8, 0d0, 0d0, 0.12d0, ov2, ov2_n, & + numElements, numElements_n, heights, heights_n, recombine, ierr) + + call gmshModelGeoMeshSetSize(ss, 16_8, lc * 3, ierr) + + call gmshModelGeoSynchronize(ierr) + + itmp = gmshModelAddPhysicalGroup(3, g7, 2_8, 1, "", ierr) + + call gmshModelSetPhysicalName(3, 1, "The volume" // c_null_char, ierr) + + call gmshModelMeshGenerate(3, ierr) + call gmshWrite("t2.msh" // c_null_char, ierr) + + ! call gmshFltkRun(ierr) + + call gmshFinalize(ierr) + + deallocate(tmp) + deallocate(argv) + +end program main diff --git a/tutorials/fortran/t6.f b/tutorials/fortran/t6.f deleted file mode 100644 index 5a6057015905d561118ce13560d47f0bd8589aab..0000000000000000000000000000000000000000 --- a/tutorials/fortran/t6.f +++ /dev/null @@ -1,139 +0,0 @@ -c --------------------------------------------------------------------------- -c -c Gmsh Fortran tutorial 6 -c -c Transfinite meshes -c -c --------------------------------------------------------------------------- - - include "gmshf.h" - - program main - use, intrinsic :: iso_c_binding - use gmsh_fortran - - implicit none - integer(c_int) :: ierr, argc, itmp, i, status, len - integer(c_int) :: p1, p2, l1, l2, l3 - real(c_double) :: lc - - integer(c_int) :: cl1(4) = (/4, 1, -2, 3/) - integer(c_int) :: cl2(6) = (/2, -1, 0, 0, 0, -3/) - integer(c_int) :: cl3(4) = (/13, 10, 11, 12/) - integer(c_int) :: s1(1) = (/1/) - integer(c_int) :: s2(1) = (/-2/) - integer(c_int) :: s3(1) = (/14/) - - integer(c_int) :: r4(4) = (/2, 1, 1, 4/) - integer(c_int) :: ts(4) = (/1, 2, 3, 4/) - - type(c_ptr), allocatable :: argv(:) - - type string - character(len = :, kind = c_char), allocatable :: item - end type string - type(string), allocatable, target :: tmp(:) - - character(80) :: buf - - lc = 1d - 2 - - argc = command_argument_count() - allocate(argv(argc + 2)) - allocate(tmp(argc + 1)) - - do i = 0, argc - call get_command_argument(i, buf, len) - tmp(i + 1) % item = buf(1 : len) // c_null_char - argv(i + 1) = c_loc(tmp(i + 1) % item) - enddo - argv(argc + 2) = c_null_ptr - - call gmshInitialize(argc + 1, argv, 1, 0, ierr) - - call gmshModelAdd("t6" // c_null_char, ierr) - - itmp = gmshModelGeoAddPoint(0d0, 0d0, 0d0, lc, 1, ierr) - itmp = gmshModelGeoAddPoint(0.1d0, 0d0, 0d0, lc, 2, ierr) - itmp = gmshModelGeoAddPoint(0.1d0, 0.3d0, 0d0, lc, 3, ierr) - itmp = gmshModelGeoAddPoint(0d0, 0.3d0, 0d0, lc, 4, ierr) - - itmp = gmshModelGeoAddLine(1, 2, 1, ierr) - itmp = gmshModelGeoAddLine(3, 2, 2, ierr) - itmp = gmshModelGeoAddLine(3, 4, 3, ierr) - itmp = gmshModelGeoAddLine(4, 1, 4, ierr) - - itmp = gmshModelGeoAddCurveLoop(cl1, 4_8, 1, 0, ierr) - itmp = gmshModelGeoAddPlaneSurface(s1, 1_8, 1, ierr) - - call gmshModelGeoRemove(r4, 4_8, 0, ierr) - - p1 = gmshModelGeoAddPoint(-0.05d0, 0.05d0, 0d0, lc, -1, ierr) - p2 = gmshModelGeoAddPoint(-0.05d0, 0.1d0, 0d0, lc, -1, ierr) - - l1 = gmshModelGeoAddLine(1, p1, -1, ierr) - l2 = gmshModelGeoAddLine(p1, p2, -1, ierr) - l3 = gmshModelGeoAddLine(p2, 4, -1, ierr) - - cl2(3) = l1 - cl2(4) = l2 - cl2(5) = l3 - itmp = gmshModelGeoAddCurveLoop(cl2, 6_8, 2, 0, ierr) - itmp = gmshModelGeoAddPlaneSurface(s2, 1_8, 1, ierr) - - call gmshModelGeoMeshSetTransfiniteCurve(2, 20, - & "Progression" // c_null_char, 1d0, ierr) - call gmshModelGeoMeshSetTransfiniteCurve(l1, 6, - & "Progression" // c_null_char, 1d0, ierr) - call gmshModelGeoMeshSetTransfiniteCurve(l2, 6, - & "Progression" // c_null_char, 1d0, ierr) - call gmshModelGeoMeshSetTransfiniteCurve(l3, 10, - & "Progression" // c_null_char, 1d0, ierr) - call gmshModelGeoMeshSetTransfiniteCurve(1, 30, - & "Progression" // c_null_char, -1.2d0, ierr) - call gmshModelGeoMeshSetTransfiniteCurve(3, 30, - & "Progression" // c_null_char, 1.2d0, ierr) - - call gmshModelGeoMeshSetTransfiniteSurface(1, - & "Left" // c_null_char, ts, 4_8, ierr) - call gmshModelGeoMeshSetRecombine(2, 1, 45d0, ierr) - - itmp = gmshModelGeoAddPoint(0.2d0, 0.2d0, 0d0, 1d0, 7, ierr) - itmp = gmshModelGeoAddPoint(0.2d0, 0.1d0, 0d0, 1d0, 8, ierr) - itmp = gmshModelGeoAddPoint(0d0, 0.3d0, 0d0, 1d0, 9, ierr) - itmp = gmshModelGeoAddPoint(0.25d0, 0.2d0, 0d0, 1d0, 10, ierr) - itmp = gmshModelGeoAddPoint(0.3d0, 0.1d0, 0d0, 1d0, 11, ierr) - - itmp = gmshModelGeoAddLine(8, 11, 10, ierr) - itmp = gmshModelGeoAddLine(11, 10, 11, ierr) - itmp = gmshModelGeoAddLine(10, 7, 12, ierr) - itmp = gmshModelGeoAddLine(7, 8, 13, ierr) - - itmp = gmshModelGeoAddCurveLoop(cl3, 4_8, 14, 0, ierr) - itmp = gmshModelGeoAddPlaneSurface(s3, 1_8, 15, ierr) - - do i = 10, 13 - call gmshModelGeoMeshSetTransfiniteCurve(i, 10, - & "Progression" // c_null_char, 1d0, ierr) - enddo - - call gmshModelGeoMeshSetTransfiniteSurface(15, - & "Left" // c_null_char, ts, 0_8, ierr) - - call gmshOptionSetNumber("Mesh.Smoothing" // c_null_char, - & 100d0, ierr) - - call gmshModelGeoSynchronize(ierr) - - call gmshModelMeshGenerate(2, ierr) - call gmshWrite("t6.msh" // c_null_char, ierr) - -c call gmshFltkRun(ierr) - - call gmshFinalize(ierr) - - deallocate(tmp) - deallocate(argv) - - stop - end diff --git a/tutorials/fortran/t6.f90 b/tutorials/fortran/t6.f90 new file mode 100644 index 0000000000000000000000000000000000000000..9610c2579689a6f76cc165adc403d0bf60035d52 --- /dev/null +++ b/tutorials/fortran/t6.f90 @@ -0,0 +1,126 @@ +! --------------------------------------------------------------------------- +! +! Gmsh Fortran tutorial 6 +! +! Transfinite meshes +! +! --------------------------------------------------------------------------- + +program main + use, intrinsic :: iso_c_binding + use gmsh + + implicit none + integer(c_int) :: ierr, argc, itmp, i, len + integer(c_int) :: p1, p2, l1, l2, l3 + real(c_double) :: lc + + integer(c_int) :: cl1(4) = [4, 1, -2, 3] + integer(c_int) :: cl2(6) = [2, -1, 0, 0, 0, -3] + integer(c_int) :: cl3(4) = [13, 10, 11, 12] + integer(c_int) :: s1(1) = [1] + integer(c_int) :: s2(1) = [-2] + integer(c_int) :: s3(1) = [14] + + integer(c_int) :: r4(4) = [2, 1, 1, 4] + integer(c_int) :: ts(4) = [1, 2, 3, 4] + + type(c_ptr), allocatable :: argv(:) + + type string + character(len = :, kind = c_char), allocatable :: item + end type string + type(string), allocatable, target :: tmp(:) + + character(80) :: buf + + lc = 0.1 + + argc = command_argument_count() + allocate(argv(argc + 2)) + allocate(tmp(argc + 1)) + + do i = 0, argc + call get_command_argument(i, buf, len) + tmp(i + 1) % item = buf(1 : len) // c_null_char + argv(i + 1) = c_loc(tmp(i + 1) % item) + enddo + argv(argc + 2) = c_null_ptr + + call gmshInitialize(argc + 1, argv, 1, 0, ierr) + + call gmshModelAdd("t6"//c_null_char, ierr) + + itmp = gmshModelGeoAddPoint(0d0, 0d0, 0d0, lc, 1, ierr) + itmp = gmshModelGeoAddPoint(0.1d0, 0d0, 0d0, lc, 2, ierr) + itmp = gmshModelGeoAddPoint(0.1d0, 0.3d0, 0d0, lc, 3, ierr) + itmp = gmshModelGeoAddPoint(0d0, 0.3d0, 0d0, lc, 4, ierr) + + itmp = gmshModelGeoAddLine(1, 2, 1, ierr) + itmp = gmshModelGeoAddLine(3, 2, 2, ierr) + itmp = gmshModelGeoAddLine(3, 4, 3, ierr) + itmp = gmshModelGeoAddLine(4, 1, 4, ierr) + + itmp = gmshModelGeoAddCurveLoop(cl1, 4_8, 1, 0, ierr) + itmp = gmshModelGeoAddPlaneSurface(s1, 1_8, 1, ierr) + + call gmshModelGeoRemove(r4, 4_8, 0, ierr) + + p1 = gmshModelGeoAddPoint(-0.05d0, 0.05d0, 0d0, lc, -1, ierr) + p2 = gmshModelGeoAddPoint(-0.05d0, 0.1d0, 0d0, lc, -1, ierr) + + l1 = gmshModelGeoAddLine(1, p1, -1, ierr) + l2 = gmshModelGeoAddLine(p1, p2, -1, ierr) + l3 = gmshModelGeoAddLine(p2, 4, -1, ierr) + + cl2(3) = l1 + cl2(4) = l2 + cl2(5) = l3 + itmp = gmshModelGeoAddCurveLoop(cl2, 6_8, 2, 0, ierr) + itmp = gmshModelGeoAddPlaneSurface(s2, 1_8, 1, ierr) + + call gmshModelGeoMeshSetTransfiniteCurve(2, 20, "Progression"//c_null_char, 1d0, ierr) + call gmshModelGeoMeshSetTransfiniteCurve(l1, 6, "Progression"//c_null_char, 1d0, ierr) + call gmshModelGeoMeshSetTransfiniteCurve(l2, 6, "Progression"//c_null_char, 1d0, ierr) + call gmshModelGeoMeshSetTransfiniteCurve(l3, 10, "Progression"//c_null_char, 1d0, ierr) + call gmshModelGeoMeshSetTransfiniteCurve(1, 30, "Progression"//c_null_char, -1.2d0, ierr) + call gmshModelGeoMeshSetTransfiniteCurve(3, 30, "Progression"//c_null_char, 1.2d0, ierr) + + call gmshModelGeoMeshSetTransfiniteSurface(1,"Left"//c_null_char, ts, 4_8, ierr) + call gmshModelGeoMeshSetRecombine(2, 1, 45d0, ierr) + + itmp = gmshModelGeoAddPoint(0.2d0, 0.2d0, 0d0, 1d0, 7, ierr) + itmp = gmshModelGeoAddPoint(0.2d0, 0.1d0, 0d0, 1d0, 8, ierr) + itmp = gmshModelGeoAddPoint(0d0, 0.3d0, 0d0, 1d0, 9, ierr) + itmp = gmshModelGeoAddPoint(0.25d0, 0.2d0, 0d0, 1d0, 10, ierr) + itmp = gmshModelGeoAddPoint(0.3d0, 0.1d0, 0d0, 1d0, 11, ierr) + + itmp = gmshModelGeoAddLine(8, 11, 10, ierr) + itmp = gmshModelGeoAddLine(11, 10, 11, ierr) + itmp = gmshModelGeoAddLine(10, 7, 12, ierr) + itmp = gmshModelGeoAddLine(7, 8, 13, ierr) + + itmp = gmshModelGeoAddCurveLoop(cl3, 4_8, 14, 0, ierr) + itmp = gmshModelGeoAddPlaneSurface(s3, 1_8, 15, ierr) + + do i = 10, 13 + call gmshModelGeoMeshSetTransfiniteCurve(i, 10, "Progression"//c_null_char, 1d0, ierr) + enddo + + call gmshModelGeoMeshSetTransfiniteSurface(15, "Left"//c_null_char, ts, 0_8, ierr) + + call gmshOptionSetNumber("Mesh.Smoothing"//c_null_char, 100d0, ierr) + + call gmshModelGeoSynchronize(ierr) + + call gmshModelMeshGenerate(2, ierr) + call gmshWrite("t6.msh"//c_null_char, ierr) + + ! call gmshFltkRun(ierr) + + call gmshFinalize(ierr) + + deallocate(tmp) + deallocate(argv) + +end program main