program main use preciceFSSICAS implicit none CHARACTER*512 :: configFileName CHARACTER*50 :: participantName, meshName, writeInitialData, readItCheckp, writeItCheckp CHARACTER*50 :: readDataName, writeDataName INTEGER :: solverProcessIndex, solverProcessSize, ongoing, dimensions, meshID, bool, numberOfVertices, i,j INTEGER :: readDataID, writeDataID DOUBLE PRECISION :: dt, t DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: vertices, writeData, readData, temp1, temp2, temp3, du, dv, dw INTEGER, DIMENSION(:), ALLOCATABLE :: vertexIDs !给出本部分的名称以及写有配置信息的文件名称 participantName = "FSSI_CAS" configFileName = "./precice-config.xml" !给出计算过程中本部分的编号,以及耦合计算时所需的核数 solverProcessIndex = 0 solverProcessSize = 1 !默认时间步 dt = 0.1 t = 10.2 !给出固体节点的个数,节点坐标以及固体网格的名称(用于信息传递) numberOfVertices = 20 dimensions = 2 meshName = "Solid-Mesh" !创建precice对象 call precicef_create(participantName, configFileName, solverProcessIndex, solverProcessSize) !获取维度信息 call precicef_get_dims(dimensions) !allocate动态分配内存 !根据前面指定的节点个数和维度数,分配用于储存节点坐标(节点数和维度数之乘积)、节点ID !以及要读取的从固体域映射过来的力、要通过固体域边界处的网格映射给流体域网格的位移的空间 allocate(vertices(numberOfVertices*dimensions)) allocate(vertexIDs(numberOfVertices)) allocate(readData(numberOfVertices*dimensions)) allocate(writeData(numberOfVertices*dimensions)) allocate(temp1(numberOfVertices)) allocate(temp2(numberOfVertices)) open(15, File = "VerticesInCoupling") do i=1, numberOfVertices read(15, *) temp1(i), temp2(i) end do close(15) do i=1, numberOfVertices vertices((i-1)*dimensions+1) = temp1(i) vertices((i-1)*dimensions+2) = temp2(i) end do deallocate(temp1) deallocate(temp2) write(*,*) 'VerticesInCoupling' write(*,*) vertices !获取网格编号(preCICE分别给固体、流体网格一个编号) call precicef_get_mesh_id(meshName, meshID) !由vertices生成各自的vertexID call precicef_set_vertices(meshID, numberOfVertices, vertices, vertexIDs ) deallocate(vertices) readDataName = 'Force0' writeDataName = 'Displacements0' !给读取数据和写数据的两个数组以编号 call precicef_get_data_id(readDataName,meshID,readDataID) call precicef_get_data_id(writeDataName,meshID,writeDataID) call precicef_initialize(dt) !至此,所需的各项初始化工作已完成,开始进入耦合计算阶段 call precicef_is_coupling_ongoing(ongoing) !以ongoing控制循环 do while (ongoing .NE. 0) !读入BlockVectorData,即读入流体域计算出的边界单元上的Force call precicef_read_bvdata(readDataID, numberOfVertices, vertexIDs, readData) allocate(du(numberOfVertices)) allocate(dv(numberOfVertices)) do i=1, numberOfVertices du(i)=0.5*dsin(dt) dv(i)=0.25*dsin(dt) end do !preCICE要的数据形式是一维数组,给出各点的位移 do i=1, numberOfVertices writeData((i-1)*dimensions+1) = du(i) writeData((i-1)*dimensions+2) = dv(i) end do deallocate(du) deallocate(dv) write(*,*) 'writeData' write(*,*) writeData call precicef_write_bvdata(writeDataID, numberOfVertices, vertexIDs, writeData) !更新时间步 call precicef_advance(dt) !判断是否到达预设的计算时间,未达到则继续循环 call precicef_is_coupling_ongoing(ongoing) enddo call precicef_finalize() write(*,*) 'Simulation done.' deallocate(writeData) deallocate(readData) deallocate(vertexIDs) end program main