module function construct_square_second(id, global_coordinate, input) result(element)
implicit none
integer(int32), intent(in) :: id
type(type_dp_3d), pointer, intent(in) :: global_coordinate
type(type_input), intent(in) :: input
class(abst_element), allocatable :: element
integer(int32) :: i
integer(int32) :: num_nodes, num_gauss
real(real64), allocatable :: weight(:)
real(real64), allocatable :: gauss(:, :)
allocate (type_square_second :: element)
num_nodes = input%geometry%vtk%cells(id)%num_nodes_in_cell
select case (input%basic%geometry_settings%integration_type)
case ("full")
num_gauss = 9_int32
call allocate_array(weight, num_gauss)
call allocate_array(gauss, 3_int32, num_gauss)
weight(:) = [25.0d0 / 81.0d0, 40.0d0 / 81.0d0, 25.0d0 / 81.0d0, 40.0d0 / 81.0d0, &
64.0d0 / 81.0d0, 40.0d0 / 81.0d0, 25.0d0 / 81.0d0, 40.0d0 / 81.0d0, &
25.0d0 / 81.0d0]
gauss(:, 1) = [-sqrt(3.0d0 / 5.0d0), -sqrt(3.0d0 / 5.0d0), 0.0d0]
gauss(:, 2) = [0.0d0, -sqrt(3.0d0 / 5.0d0), 0.0d0]
gauss(:, 3) = [sqrt(3.0d0 / 5.0d0), -sqrt(3.0d0 / 5.0d0), 0.0d0]
gauss(:, 4) = [-sqrt(3.0d0 / 5.0d0), 0.0d0, 0.0d0]
gauss(:, 5) = [0.0d0, 0.0d0, 0.0d0]
gauss(:, 6) = [sqrt(3.0d0 / 5.0d0), 0.0d0, 0.0d0]
gauss(:, 7) = [-sqrt(3.0d0 / 5.0d0), sqrt(3.0d0 / 5.0d0), 0.0d0]
gauss(:, 8) = [0.0d0, sqrt(3.0d0 / 5.0d0), 0.0d0]
gauss(:, 9) = [sqrt(3.0d0 / 5.0d0), sqrt(3.0d0 / 5.0d0), 0.0d0]
case ("reduced")
num_gauss = 4_int32
call allocate_array(weight, num_gauss)
call allocate_array(gauss, 3_int32, num_gauss)
weight(:) = [1.0d0, 1.0d0, 1.0d0, 1.0d0]
gauss(:, 1) = [-sqrt(1.0d0 / 3.0d0), -sqrt(1.0d0 / 3.0d0), 0.0d0]
gauss(:, 2) = [-sqrt(1.0d0 / 3.0d0), sqrt(1.0d0 / 3.0d0), 0.0d0]
gauss(:, 3) = [sqrt(1.0d0 / 3.0d0), sqrt(1.0d0 / 3.0d0), 0.0d0]
gauss(:, 4) = [sqrt(1.0d0 / 3.0d0), -sqrt(1.0d0 / 3.0d0), 0.0d0]
case ("free")
num_gauss = 4_int32
call allocate_array(weight, num_gauss)
call allocate_array(gauss, 3_int32, num_gauss)
weight(:) = [1.0d0, 1.0d0, 1.0d0, 1.0d0]
gauss(:, 1) = [-input%basic%geometry_settings%integration_points, -input%basic%geometry_settings%integration_points, 0.0d0]
gauss(:, 2) = [-input%basic%geometry_settings%integration_points, input%basic%geometry_settings%integration_points, 0.0d0]
gauss(:, 3) = [input%basic%geometry_settings%integration_points, input%basic%geometry_settings%integration_points, 0.0d0]
gauss(:, 4) = [input%basic%geometry_settings%integration_points, -input%basic%geometry_settings%integration_points, 0.0d0]
end select
call element%initialize(id=id, &
type=input%geometry%vtk%cells(id)%cell_type, &
group=input%geometry%vtk%cells(id)%cell_entity_id, &
dimension=input%geometry%vtk%cells(id)%get_dimension(), &
order=input%geometry%vtk%cells(id)%get_order(), &
num_nodes=num_nodes, &
connectivity=input%geometry%vtk%cells(id)%connectivity(1:num_nodes), &
num_gauss=num_gauss, &
weight=weight, &
gauss=gauss, &
global_coordinate=global_coordinate)
end function construct_square_second