Hi,
I wrote the following FISH to help me to cancel and create tetrahedron with the final aim of modifying the position of a gridpoint.
Since there is no a specific function to move a single gridpoint of the grid before the solve command (maybe I’m wrong), I tried to modify the position of a gridpoint by cancelling all the zone pointing to that gridpoint and replacing them with new zones.
The problem of creating a tetrahedron is to input the four vertex points in a specific position, in the way the vectors point 0 – point 1, point 0 – point 2, point 0 – point 3 is a right-handed coordinate system, to have positive volume:
To check if the coord system is right-handed I used the following condition:
V = (Dx x Dy) ° Dz /6 > 0
where x is the cross product, ° is the dot product and Dx, Dy, Dz are the vectors p1-p0, p2-p0, p3-p0. If the volume is < 0, then I exchange Dx with Dy to obtain a positive volume as (Dx x Dy) = - (Dy x Dx).
In my specific case, from the check, one volume is negative due to the gridpoint move and the above condition is capable to catch it and to create a positive volume zone.
The original gridpoint is erased when the last zone is deleted.


Here below the code:
fish define move_gp(gp_ID,x_coord,y_coord,z_coord)
;
    global coor_list = list.create(12)
    local pnt_gp = gp.find(gp_ID) 
    local zn_list = gp.zone(pnt_gp)
    global zn_num = list.size(zn_list)
    global check = list.create(zn_num)
    global zn_vol = list.create(zn_num)
    global zn_quality = list.create(zn_num)
    global kk = 0
    ;
    loop foreach pnt_zn zn_list
        ;
        jj = 1
        gp_list = zone.gp(pnt_zn) 
        zn_ID = zone.id(pnt_zn)
        zn_group = zone.group(pnt_zn,"Zoning")
        zn_vol(kk+1) = zone.vol(pnt_zn)
        zn_vol(kk+1) = zone.test.quality(pnt_zn,2)
        
        ;
        loop foreach pnt_pn gp_list
            ;
            coor_list(jj) = gp.pos.x(pnt_pn)
            coor_list(jj+1) = gp.pos.y(pnt_pn)
            coor_list(jj+2) = gp.pos.z(pnt_pn)
            ;
            if gp.id(pnt_pn) == gp_ID then
                ;
                coor_list(jj) = x_coord
                coor_list(jj+1) = y_coord
                coor_list(jj+2) = z_coord
                ;
            endif
            ;
            jj = jj+3
            ;
        endloop
        ;
        ;Check Coord Sys
        Dx = list.sequence((coor_list(4)-coor_list(1)),(coor_list(5)-coor_list(2)),(coor_list(6)-coor_list(3)))
        Dy = list.sequence((coor_list(7)-coor_list(1)),(coor_list(8)-coor_list(2)),(coor_list(9)-coor_list(3)))
        Dz =  list.sequence((coor_list(10)-coor_list(1)),(coor_list(11)-coor_list(2)),(coor_list(12)-coor_list(3)))
        ;
        check(kk+1) = ((Dx(2)*Dy(3)-Dx(3)*Dy(2))*Dz(1)+(Dx(3)*Dy(1)-Dx(1)*Dy(3))*Dz(2)+(Dx(1)*Dy(2)-Dx(2)*Dy(1))*Dz(3))/6.
        ;
        if check(kk+1) < 0 then
            ;
            mov_1 = list.sequence(coor_list(7),coor_list(8),coor_list(9))
            mov_2 = list.sequence(coor_list(4),coor_list(5),coor_list(6))
            coor_list(4) = mov_1(1)
            coor_list(5) = mov_1(2)
            coor_list(6) = mov_1(3)
            coor_list(7) = mov_2(1)
            coor_list(8) = mov_2(2)
            coor_list(9) = mov_2(3)
            ;
        endif
        ;
        command
            ;
            zone delete range id [zn_ID]
            zone create tetrahedron point 0 ([coor_list(1)],[coor_list(2)],[coor_list(3)]) ...
                                    point 1 ([coor_list(4)],[coor_list(5)],[coor_list(6)]) ...
                                    point 2 ([coor_list(7)],[coor_list(8)],[coor_list(9)]) ...
                                    point 3 ([coor_list(10)],[coor_list(11)],[coor_list(12)]) ...
                                    size 1 1 1 group [string(check(kk+1))] slot "Zoning"
            ;
        endcommand
        ;
        kk = kk+1
        ;
    endloop
    ;
    loop ii (1,zn_num)
        ;
        var = (check(ii)-zn_vol(ii))/zn_vol(ii)
        ;
        command
            print @check([ii])
            print @zn_vol([ii])
            ;print @zn_vol([ii])
            ;print @var
        endcommand
    endloop
end
[move_gp(67745,346.39,144.54,216.92)]