A subroutine to test the tem_polygon_material_value function in tem_polygon_material_test.
The only argument will be true, if all calculations result in the expected values.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
logical, | intent(out) | :: | success |
Indicator if all tests were computed correctly. |
subroutine tem_polygon_material_test_value(success) ! ---------------------------------------------------------------------- !> Indicator if all tests were computed correctly. logical, intent(out) :: success ! ---------------------------------------------------------------------- type(tem_polygon_material_type) :: polygon type(tem_polygon_vertex_type) :: me real(kind=rk) :: matval(1) ! ---------------------------------------------------------------------- ! Use simple polygon with 5 vertices to check the containment function. ! It has roughly this shape: ! ! x-------x ! \ | ! \ | ! x | ! / | ! / | ! x-------x ! ! With the 'x' indicating the 5 vertices. me%nVertices = 5 allocate(me%Vertex(me%nVertices,2)) me%Vertex(1,:) = [ 0.0_rk, 0.0_rk] me%Vertex(2,:) = [-1.0_rk, -1.0_rk] me%Vertex(3,:) = [ 1.0_rk, -1.0_rk] me%Vertex(4,:) = [ 1.0_rk, 1.0_rk] me%Vertex(5,:) = [-1.0_rk, 1.0_rk] ! Defining returned values for inside and outside the polygon: polygon%nComponents = 1 allocate(polygon%inval(polygon%nComponents)) allocate(polygon%outval(polygon%nComponents)) polygon%inval = 1.0_rk polygon%outval = 0.0_rk success = .true. ! (If any subsequent test fails, we set this to false.) write(*,*) 'Checking point containment for this 5 point polygon:' write(*,*) write(*,*) '(-1,1)---(1,1)' write(*,*) ' \ |' write(*,*) ' \ |' write(*,*) ' (0,0) |' write(*,*) ' / |' write(*,*) ' / |' write(*,*) '(-1,-1)--(1,-1)' write(*,*) ! Check a point inside the polygon: matval = tem_polygon_material_value( me = me, & & point = [0.5_rk, 0.5_rk], & & inval = polygon%inval, & & outval = polygon%outval, & & nComponents = polygon%nComponents ) if (matval(1) < 1.0_rk) success = .false. write(*,*) 'Point (0.5, 0.5) has value:', matval ! Check a point outside the polygon: matval = tem_polygon_material_value( me = me, & & point = [-1.0_rk, 0.0_rk], & & inval = polygon%inval, & & outval = polygon%outval, & & nComponents = polygon%nComponents ) if (matval(1) > epsilon(1.0_rk)) success = .false. write(*,*) 'Point (-1.0, 0.0) has value:', matval ! Check a point on a side of the polygon (should be considered inside): matval = tem_polygon_material_value( me = me, & & point = [-0.5_rk, -0.5_rk], & & inval = polygon%inval, & & outval = polygon%outval, & & nComponents = polygon%nComponents ) if (matval(1) < 1.0_rk) success = .false. write(*,*) 'Point (-0.5, -0.5) has value:', matval ! Check an outward pointing corner (should be outside): matval = tem_polygon_material_value( me = me, & & point = [1.0_rk, 1.0_rk], & & inval = polygon%inval, & & outval = polygon%outval, & & nComponents = polygon%nComponents ) if (matval(1) > epsilon(1.0_rk)) success = .false. write(*,*) 'Point (1.0, 1.0) has value:', matval ! Check an inward pointing corner (should be inside): matval = tem_polygon_material_value( me = me, & & point = [0.0_rk, 0.0_rk], & & inval = polygon%inval, & & outval = polygon%outval, & & nComponents = polygon%nComponents ) if (matval(1) < 1.0_rk) success = .false. write(*,*) 'Point (0.0, 0.0) has value:', matval end subroutine tem_polygon_material_test_value