Neko-TOP
A portable framework for high-order spectral element flow toplogy optimization.
Loading...
Searching...
No Matches
objective.f90
Go to the documentation of this file.
1
33
37 use simulation_m, only: simulation_t
38 use design, only: design_t
39 use num_types, only: rp
40 use point_zone_registry, only: neko_point_zone_registry
41 use json_module, only: json_file
42 implicit none
43 private
44
45 public :: objective_t, objective_factory, objective_wrapper_t
46
51 type, abstract, extends(base_functional_t) :: objective_t
52 real(kind=rp) :: weight = 1.0_rp
53
54 contains
55
57 procedure, pass(this) :: init_base => objective_init_base
59 procedure, pass(this) :: free_base => objective_free_base
60
61 end type objective_t
62
65 class(objective_t), allocatable :: objective
66 contains
67 procedure, pass(this) :: free => objective_wrapper_free
68 end type objective_wrapper_t
69
70 ! -------------------------------------------------------------------------- !
71 ! Explicit interfaces
72
74 interface
75 module subroutine objective_factory(object, json, design, simulation)
76 class(objective_t), allocatable, intent(inout) :: object
77 type(json_file), intent(inout) :: json
78 class(design_t), intent(in) :: design
79 type(simulation_t), target, optional, intent(inout) :: simulation
80 end subroutine objective_factory
81 end interface
82
83contains
84
85 ! -------------------------------------------------------------------------- !
86 ! Implementations for the base class
87
94 subroutine objective_init_base(this, name, design_size, weight, mask_name)
95 class(objective_t), intent(inout) :: this
96 character(len=*), intent(in) :: name
97 integer, intent(in) :: design_size
98 real(kind=rp), intent(in) :: weight
99 character(len=*), intent(in), optional :: mask_name
100
101 this%name = name
102 this%value = 0.0_rp
103 call this%sensitivity%init(design_size)
104
105 this%weight = weight
106
107 this%has_mask = .false.
108 if (trim(mask_name) .ne. "") then
109 this%has_mask = .true.
110 this%mask => neko_point_zone_registry%get_point_zone(mask_name)
111 end if
112
113 end subroutine objective_init_base
114
116 subroutine objective_free_base(this)
117 class(objective_t), target, intent(inout) :: this
118
119 this%value = 0.0_rp
120 call this%sensitivity%free()
121 this%weight = 1.0_rp
122 this%has_mask = .false.
123 if (associated(this%mask)) nullify(this%mask)
124
125 end subroutine objective_free_base
126
127 ! -------------------------------------------------------------------------- !
128 ! Implementations for the wrapper
129
131 subroutine objective_wrapper_free(this)
132 class(objective_wrapper_t), intent(inout) :: this
133 if (allocated(this%objective)) then
134 call this%objective%free()
135 deallocate(this%objective)
136 end if
137 end subroutine objective_wrapper_free
138
139end module objective
140
Defines the abstract the base_functional_t type.
Implements the design_t.
Definition design.f90:34
Implements the objective_t type.
Definition objective.f90:35
subroutine objective_init_base(this, name, design_size, weight, mask_name)
Factory function interface.
Definition objective.f90:95
Implements the steady_problem_t type.
An abstract design type.
Definition design.f90:50
The abstract objective type.
Definition objective.f90:51
Wrapper for objectives for use in lists.
Definition objective.f90:64