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
61 procedure, pass(this) :: get_weight => objective_get_weight
62
63 end type objective_t
64
67 class(objective_t), allocatable :: objective
68 contains
69 procedure, pass(this) :: free => objective_wrapper_free
70 end type objective_wrapper_t
71
72 ! -------------------------------------------------------------------------- !
73 ! Explicit interfaces
74
76 interface
77 module subroutine objective_factory(object, json, design, simulation)
78 class(objective_t), allocatable, intent(inout) :: object
79 type(json_file), intent(inout) :: json
80 class(design_t), intent(in) :: design
81 type(simulation_t), target, optional, intent(inout) :: simulation
82 end subroutine objective_factory
83 end interface
84
85contains
86
87 ! -------------------------------------------------------------------------- !
88 ! Implementations for the base class
89
96 subroutine objective_init_base(this, name, design_size, weight, mask_name)
97 class(objective_t), intent(inout) :: this
98 character(len=*), intent(in) :: name
99 integer, intent(in) :: design_size
100 real(kind=rp), intent(in) :: weight
101 character(len=*), intent(in), optional :: mask_name
102
103 this%name = name
104 this%value = 0.0_rp
105 call this%sensitivity%init(design_size)
106
107 this%weight = weight
108
109 this%has_mask = .false.
110 if (trim(mask_name) .ne. "") then
111 this%has_mask = .true.
112 this%mask => neko_point_zone_registry%get_point_zone(mask_name)
113 end if
114
115 end subroutine objective_init_base
116
118 subroutine objective_free_base(this)
119 class(objective_t), target, intent(inout) :: this
120
121 this%value = 0.0_rp
122 call this%sensitivity%free()
123 this%weight = 1.0_rp
124 this%has_mask = .false.
125 if (associated(this%mask)) nullify(this%mask)
126
127 end subroutine objective_free_base
128
129 ! -------------------------------------------------------------------------- !
130 ! Implementations for the wrapper
131
133 subroutine objective_wrapper_free(this)
134 class(objective_wrapper_t), intent(inout) :: this
135 if (allocated(this%objective)) then
136 call this%objective%free()
137 deallocate(this%objective)
138 end if
139 end subroutine objective_wrapper_free
140
142 pure function objective_get_weight(this) result(w)
143 class(objective_t), intent(in) :: this
144 real(kind=rp) :: w
145 w = this%weight
146 end function objective_get_weight
147
148end module objective
149
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:97
Implements the steady_problem_t type.
An abstract design type.
Definition design.f90:52
The abstract objective type.
Definition objective.f90:51
Wrapper for objectives for use in lists.
Definition objective.f90:66