diff --git a/src/mo_optimization_types.f90 b/src/mo_optimization_types.f90
index 6b9045bd49ba747df87593ffb98aa669917a14fb..7af6b392b1c75e495cd618f22721d08328f2e6f9 100644
--- a/src/mo_optimization_types.f90
+++ b/src/mo_optimization_types.f90
@@ -43,6 +43,7 @@ MODULE mo_optimization_types
     contains
     procedure :: has => sim_data_has
     procedure :: add => sim_data_add
+    procedure :: get_id => sim_data_get_id
     ! ToDo only interface public, other private
     procedure :: allocate => sim_data_allocate
     procedure :: sim_data_set_pointer_1d
@@ -166,23 +167,38 @@ MODULE mo_optimization_types
     end do
   end subroutine sim_data_allocate
 
-  ! ToDo: generate with fypp
-  ! ToDo: switch ptr with name
-  subroutine sim_data_set_pointer_1d(this, ptr, name)
+  integer function sim_data_get_id(this, name)
     class(sim_data_t), target, intent(in) :: this
-    real(dp), dimension(:), pointer, intent(inout) :: ptr
     character(*), intent(in)    :: name
 
     integer(i4) :: i
 
+    sim_data_get_id = -999
     ! ToDo: loop -> subroutine get_id
     ! i = this%get_id(name)
     do i = 1, size(this%variables)
       if (this%variables(i)%name == name) then
-        ptr => this%variables(i)%data_1d
-        ! ToDo: exit
+        sim_data_get_id = i
+        exit
       end if
     end do
+
+    if (sim_data_get_id == -999) stop ('sim_data_get_id: The simulated variable name does not exist.')
+
+  end function sim_data_get_id
+
+  ! ToDo: generate with fypp
+  ! ToDo: switch ptr with name
+  subroutine sim_data_set_pointer_1d(this, ptr, name)
+    class(sim_data_t), target, intent(in) :: this
+    real(dp), dimension(:), pointer, intent(inout) :: ptr
+    character(*), intent(in)    :: name
+
+    integer(i4) :: i
+
+    ! ToDo: loop -> subroutine get_id
+    i = this%get_id(name)
+    ptr => this%variables(i)%data_1d
   end subroutine sim_data_set_pointer_1d
 
   subroutine sim_data_set_pointer_2d(this, ptr, name)
@@ -192,11 +208,8 @@ MODULE mo_optimization_types
 
     integer(i4) :: i
 
-    do i = 1, size(this%variables)
-      if (this%variables(i)%name == name) then
-        ptr => this%variables(i)%data_2d
-      end if
-    end do
+    i = this%get_id(name)
+    ptr => this%variables(i)%data_2d
   end subroutine sim_data_set_pointer_2d
 
   subroutine sim_data_set_pointer_3d(this, ptr, name)
@@ -206,11 +219,8 @@ MODULE mo_optimization_types
 
     integer(i4) :: i
 
-    do i = 1, size(this%variables)
-      if (this%variables(i)%name == name) then
-        ptr => this%variables(i)%data_3d
-      end if
-    end do
+    i = this%get_id(name)
+    ptr => this%variables(i)%data_3d
   end subroutine sim_data_set_pointer_3d
 
   subroutine sim_data_set_pointer_4d(this, ptr, name)
@@ -220,11 +230,8 @@ MODULE mo_optimization_types
 
     integer(i4) :: i
 
-    do i = 1, size(this%variables)
-      if (this%variables(i)%name == name) then
-        ptr => this%variables(i)%data_4d
-      end if
-    end do
+    i = this%get_id(name)
+    ptr => this%variables(i)%data_4d
   end subroutine sim_data_set_pointer_4d
 
   subroutine sim_data_set_pointer_5d(this, ptr, name)
@@ -234,11 +241,8 @@ MODULE mo_optimization_types
 
     integer(i4) :: i
 
-    do i = 1, size(this%variables)
-      if (this%variables(i)%name == name) then
-        ptr => this%variables(i)%data_5d
-      end if
-    end do
+    i = this%get_id(name)
+    ptr => this%variables(i)%data_5d
   end subroutine sim_data_set_pointer_5d
 
   ! ToDo: Pass only shape instead of optidataObs