File: test_fortran_extract_variable.f90

package info (click to toggle)
lammps 20250204%2Bdfsg.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 474,368 kB
  • sloc: cpp: 1,060,070; python: 27,785; ansic: 8,956; f90: 7,254; sh: 6,044; perl: 4,171; fortran: 2,442; xml: 1,714; makefile: 1,352; objc: 238; lisp: 188; yacc: 58; csh: 16; awk: 14; tcl: 6; javascript: 2
file content (383 lines) | stat: -rw-r--r-- 12,937 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
MODULE keepvar
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr, c_size_t, c_char
  USE liblammps
  IMPLICIT NONE

  INTERFACE
    FUNCTION c_path_join(a, b) BIND(C)
      IMPORT :: c_ptr
      TYPE(c_ptr), VALUE :: a, b
      TYPE(c_ptr) :: c_path_join
    END FUNCTION c_path_join

    SUBROUTINE c_free(ptr) BIND(C,name='free')
      IMPORT :: c_ptr
      TYPE(c_ptr), VALUE :: ptr
    END SUBROUTINE c_free
  END INTERFACE

CONTAINS

  FUNCTION absolute_path(filename)
    USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr, c_size_t, c_char, C_F_POINTER
    USE keepstuff, ONLY : lmp, f2c_string, c_strlen
    CHARACTER(LEN=:), ALLOCATABLE :: absolute_path
    CHARACTER(LEN=*), INTENT(IN) :: filename
    CHARACTER(LEN=256) :: test_input_directory
    TYPE(c_ptr) :: c_test_input_directory, c_absolute_path, c_filename
    CHARACTER(LEN=1,KIND=c_char), DIMENSION(:), POINTER :: F_absolute_path
    INTEGER(c_size_t) :: i, length

    test_input_directory = lmp%extract_variable('input_dir')
    c_test_input_directory = f2c_string(test_input_directory)
    c_filename = f2c_string(filename)
    c_absolute_path = c_path_join(c_test_input_directory, c_filename)
    length = c_strlen(c_absolute_path)
    CALL C_F_POINTER(c_absolute_path, F_absolute_path, [length])
    ALLOCATE(CHARACTER(LEN=length) :: absolute_path)
    DO i = 1, length
      absolute_path(i:i) = F_absolute_path(i)
    END DO
    CALL c_free(c_filename)
    CALL c_free(c_test_input_directory)
    CALL c_free(c_absolute_path)
  END FUNCTION absolute_path

END MODULE keepvar

FUNCTION f_lammps_with_C_args(argc, argv) BIND(C)
  USE ISO_C_BINDING, ONLY: c_ptr, c_char, c_int, c_size_t, C_F_POINTER
  USE liblammps
  USE keepstuff, ONLY: lmp, c_strlen
  IMPLICIT NONE
  INTEGER(c_int), INTENT(IN), VALUE :: argc
  TYPE(c_ptr), VALUE :: argv
  TYPE(c_ptr), DIMENSION(:), POINTER :: Fargv
  INTEGER, PARAMETER :: ARG_LENGTH = 256
  TYPE(c_ptr) :: f_lammps_with_C_args
  CHARACTER(LEN=ARG_LENGTH), DIMENSION(argc) :: args
  CHARACTER(LEN=1,KIND=c_char), DIMENSION(:), POINTER :: Cstr
  INTEGER(c_size_t):: i, length, j

  CALL C_F_POINTER(argv, Fargv, [argc])
  DO i = 1, argc
    args(i) = ''
    length = c_strlen(Fargv(i))
    CALL C_F_POINTER(Fargv(i), Cstr, [length])
    DO j = 1, length
      args(i)(j:j) = Cstr(j)
    END DO
  END DO

  lmp = lammps(args)
  f_lammps_with_C_args = lmp%handle
END FUNCTION f_lammps_with_C_args

SUBROUTINE f_lammps_close() BIND(C)
  USE ISO_C_BINDING, ONLY: c_null_ptr
  USE liblammps
  USE keepstuff, ONLY: lmp
  IMPLICIT NONE

  CALL lmp%close()
  lmp%handle = c_null_ptr
END SUBROUTINE f_lammps_close

SUBROUTINE f_lammps_setup_extract_variable() BIND(C)
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp, big_input, cont_input, more_input, pair_input
  USE keepvar, ONLY : absolute_path
  IMPLICIT NONE

  ! Had to do this one as one string because lammps_commands_list and
  ! lammps_commands_string do not play well with triple quotes
  CHARACTER(LEN=256), PARAMETER :: py_input = &
      'python square_it input 1 v_lp return v_py format ff here """' &
        // NEW_LINE(' ') // 'def square_it(N) :' &
        // NEW_LINE(' ') // '  return N*N' &
        // NEW_LINE(' ') // '"""'

  CALL lmp%command('atom_modify map array')
  CALL lmp%commands_list(big_input)
  CALL lmp%commands_list(cont_input)
  CALL lmp%commands_list(more_input)
  CALL lmp%commands_list(pair_input)
  CALL lmp%command('variable idx index "hello" "goodbye"')
  CALL lmp%command('variable lp loop 10')
  CALL lmp%command('variable lp_pad loop 10 pad')
  CALL lmp%command('variable wld world "group1"')
  CALL lmp%command('variable uni universe "universe1" "universeA"')
  CALL lmp%command('variable ulp uloop 2')
  CALL lmp%command('variable str string "this is a string"')
  CALL lmp%command('variable ex equal exp(v_lp)')
  CALL lmp%command('variable fmt format ex %.6G')
  CALL lmp%command('variable fmt_pad format ex %08.6g')
  CALL lmp%command('variable username getenv FORTRAN_USER')
  CALL lmp%command('variable greeting file ' // absolute_path('greetings.txt'))
  CALL lmp%command('variable atfile atomfile ' &
    // absolute_path('atomdata.txt'))
  IF (lmp%config_has_package('PYTHON')) THEN
    CALL lmp%command(py_input)
    CALL lmp%command('variable py python square_it')
  END IF
  CALL lmp%command('variable time timer')
  CALL lmp%command('variable int internal 4')
  CALL lmp%command('variable at_z atom z')
  CALL lmp%command("compute COM all com") ! defines a global vector
  CALL lmp%command("variable center vector c_COM")
  ! make sure COM is computable...
  CALL lmp%command("thermo_style custom step pe c_COM[1] v_center[1]")
  CALL lmp%command("run 0") ! so c_COM and v_center have values
END SUBROUTINE f_lammps_setup_extract_variable

FUNCTION f_lammps_extract_variable_index_1() BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp
  IMPLICIT NONE
  INTEGER(c_int) :: f_lammps_extract_variable_index_1
  CHARACTER(LEN=256) :: str

  str = lmp%extract_variable("idx")
  IF (trim(str) == 'hello') THEN
     f_lammps_extract_variable_index_1 = 1_c_int
  ELSE
     f_lammps_extract_variable_index_1 = 0_c_int
  END IF
END FUNCTION f_lammps_extract_variable_index_1

FUNCTION f_lammps_extract_variable_index_2() BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp
  IMPLICIT NONE
  INTEGER(c_int) :: f_lammps_extract_variable_index_2
  CHARACTER(LEN=256) :: str

  str = lmp%extract_variable("idx")
  IF (trim(str) == 'goodbye') THEN
     f_lammps_extract_variable_index_2 = 1_c_int
  ELSE
     f_lammps_extract_variable_index_2 = 0_c_int
  END IF
END FUNCTION f_lammps_extract_variable_index_2

FUNCTION f_lammps_extract_variable_loop() BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp
  IMPLICIT NONE
  INTEGER(c_int) :: f_lammps_extract_variable_loop
  CHARACTER(LEN=256) :: loop

  loop = lmp%extract_variable('lp')
  READ(loop,*) f_lammps_extract_variable_loop
END FUNCTION f_lammps_extract_variable_loop

FUNCTION f_lammps_extract_variable_loop_pad() BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp, f2c_string
  IMPLICIT NONE
  TYPE(c_ptr) :: f_lammps_extract_variable_loop_pad
  CHARACTER(LEN=20) :: loop

  loop = lmp%extract_variable('lp_pad')
  f_lammps_extract_variable_loop_pad = f2c_string(loop)
END FUNCTION f_lammps_extract_variable_loop_pad

FUNCTION f_lammps_extract_variable_world() BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp, f2c_string
  IMPLICIT NONE
  TYPE(c_ptr) :: f_lammps_extract_variable_world
  CHARACTER(LEN=20) :: world

  world = lmp%extract_variable('wld')
  f_lammps_extract_variable_world = f2c_string(world)
END FUNCTION f_lammps_extract_variable_world

FUNCTION f_lammps_extract_variable_universe() BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp, f2c_string
  IMPLICIT NONE
  TYPE(c_ptr) :: f_lammps_extract_variable_universe
  CHARACTER(LEN=20) :: universe

  universe = lmp%extract_variable('uni')
  f_lammps_extract_variable_universe = f2c_string(universe)
END FUNCTION f_lammps_extract_variable_universe

FUNCTION f_lammps_extract_variable_uloop() BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp
  IMPLICIT NONE
  INTEGER(c_int) :: f_lammps_extract_variable_uloop
  CHARACTER(LEN=256) :: uloop

  uloop = lmp%extract_variable('ulp')
  READ(uloop,*) f_lammps_extract_variable_uloop
END FUNCTION f_lammps_extract_variable_uloop

FUNCTION f_lammps_extract_variable_string() BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp, f2c_string
  IMPLICIT NONE
  TYPE(c_ptr) :: f_lammps_extract_variable_string
  CHARACTER(LEN=256) :: string

  string = lmp%extract_variable('str')
  f_lammps_extract_variable_string = f2c_string(string)
END FUNCTION f_lammps_extract_variable_string

FUNCTION f_lammps_extract_variable_format() BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp, f2c_string
  IMPLICIT NONE
  TYPE(c_ptr) :: f_lammps_extract_variable_format
  CHARACTER(LEN=20) :: form

  form = lmp%extract_variable('fmt')
  f_lammps_extract_variable_format = f2c_string(form)
END FUNCTION f_lammps_extract_variable_format

FUNCTION f_lammps_extract_variable_format_pad() BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp, f2c_string
  IMPLICIT NONE
  TYPE(c_ptr) :: f_lammps_extract_variable_format_pad
  CHARACTER(LEN=20) :: form

  form = lmp%extract_variable('fmt_pad')
  f_lammps_extract_variable_format_pad = f2c_string(form)
END FUNCTION f_lammps_extract_variable_format_pad

FUNCTION f_lammps_extract_variable_getenv() BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp, f2c_string
  IMPLICIT NONE
  TYPE(c_ptr) :: f_lammps_extract_variable_getenv
  CHARACTER(LEN=40) :: string

  string = lmp%extract_variable('username')
  f_lammps_extract_variable_getenv = f2c_string(string)
END FUNCTION f_lammps_extract_variable_getenv

FUNCTION f_lammps_extract_variable_file() BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp, f2c_string
  IMPLICIT NONE
  TYPE(c_ptr) :: f_lammps_extract_variable_file
  CHARACTER(LEN=40) :: string

  string = lmp%extract_variable('greeting')
  f_lammps_extract_variable_file = f2c_string(string)
END FUNCTION f_lammps_extract_variable_file

FUNCTION f_lammps_extract_variable_atomfile(i) BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp
  IMPLICIT NONE
  INTEGER(c_int), INTENT(IN), VALUE :: i
  REAL(c_double) :: f_lammps_extract_variable_atomfile
  REAL(c_double), DIMENSION(:), ALLOCATABLE :: atom_data

  atom_data = lmp%extract_variable('atfile')
  f_lammps_extract_variable_atomfile = atom_data(i)
END FUNCTION f_lammps_extract_variable_atomfile

FUNCTION f_lammps_extract_variable_python() BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp
  IMPLICIT NONE
  REAL(c_double) :: f_lammps_extract_variable_python

  f_lammps_extract_variable_python = lmp%extract_variable('py')
END FUNCTION f_lammps_extract_variable_python

FUNCTION f_lammps_extract_variable_timer() BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp
  IMPLICIT NONE
  REAL(c_double) :: f_lammps_extract_variable_timer

  f_lammps_extract_variable_timer = lmp%extract_variable('time')
END FUNCTION f_lammps_extract_variable_timer

FUNCTION f_lammps_extract_variable_internal() BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp
  IMPLICIT NONE
  REAL(c_double) :: f_lammps_extract_variable_internal

  f_lammps_extract_variable_internal = lmp%extract_variable('int')
END FUNCTION f_lammps_extract_variable_internal

FUNCTION f_lammps_extract_variable_equal() BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp
  IMPLICIT NONE
  REAL(c_double) :: f_lammps_extract_variable_equal

  f_lammps_extract_variable_equal = lmp%extract_variable('ex')
END FUNCTION f_lammps_extract_variable_equal

FUNCTION f_lammps_extract_variable_atom(i) BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp
  IMPLICIT NONE
  INTEGER(c_int), INTENT(IN), VALUE :: i
  REAL(c_double) :: f_lammps_extract_variable_atom
  REAL(c_double), DIMENSION(:), ALLOCATABLE :: atom

  atom = lmp%extract_variable('at_z') ! z-coordinates
  f_lammps_extract_variable_atom = atom(i)
END FUNCTION f_lammps_extract_variable_atom

FUNCTION f_lammps_extract_variable_vector(i) BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp
  IMPLICIT NONE
  INTEGER(c_int), INTENT(IN), VALUE :: i
  REAL(c_double) :: f_lammps_extract_variable_vector
  REAL(c_double), DIMENSION(:), ALLOCATABLE :: vector

  vector = lmp%extract_variable('center') ! z-coordinates
  f_lammps_extract_variable_vector = vector(i)
END FUNCTION f_lammps_extract_variable_vector

SUBROUTINE f_lammps_set_string_variable() BIND(C)
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp, f2c_string
  IMPLICIT NONE
  CHARACTER(LEN=40) :: string

  string = "this is the new string"
  CALL lmp%set_string_variable('str', string)
END SUBROUTINE f_lammps_set_string_variable

SUBROUTINE f_lammps_set_internal_variable() BIND(C)
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double
  USE LIBLAMMPS
  USE keepstuff, ONLY : lmp, f2c_string
  IMPLICIT NONE

  CALL lmp%set_internal_variable('int', -2.5_c_double)
END SUBROUTINE f_lammps_set_internal_variable

! vim: sts=2 ts=2 sw=2 et