def cylindrical_receiver(rec_param, hemisphere='North'):
    """
    hemishpere : 'North' or 'South' hemisphere of the earth where the field located
                if North: the field is in the positive y direction
                if South: the field is in the negtive y direction
                this will influence:
                 (1) the setting of the receiver tilt angle, 
                     if the front surface always facing to the field is desirable
                 (2) the position of the virtual target
    """
    rec_r = rec_param[0]
    rec_h = rec_param[1]
    slices = rec_param[2]
    x = rec_param[3]
    y = rec_param[4]
    z = rec_param[5]
    geom = ''
    geom += '- geometry: &%s\n' % 'target_g'
    geom += '  - material: *%s\n' % 'material_target'
    geom += '    cylinder: \n'
    geom += '      height: %s\n' % rec_h
    geom += '      radius: %s\n' % rec_r
    geom += '      slices: %d\n' % slices
    geom += '\n'
    entt = ''
    entt += '\n- entity:\n'
    entt += '    name: target_e\n'
    entt += '    primary: 0\n'
    entt += '    transform: { translation: %s, rotation: %s }\n' % ([x, y,
        z], [0.0, 0.0, 0.0])
    entt += '    geometry: *%s\n' % 'target_g'
    Vsize = 100.0
    pts = [[-rec_h * Vsize, -rec_h * Vsize], [-rec_h * Vsize, rec_h * Vsize
        ], [rec_h * Vsize, rec_h * Vsize], [rec_h * Vsize, -rec_h * Vsize]]
    slices = 4
    entt += '\n- entity:\n'
    entt += '    name: virtual_target_e\n'
    entt += '    primary: 0\n'
    entt += '    transform: { translation: %s, rotation: %s }\n' % ([x, y, 
        z + rec_h / 2.0 + 1], [-180.0, 0, 0])
    entt += '    geometry: \n'
    entt += '      - material: *%s\n' % 'material_virtual'
    entt += '        plane: \n'
    entt += '          clip: \n'
    entt += '          - operation: AND \n'
    entt += '            vertices: %s\n' % pts
    entt += '          slices: %d\n' % slices
    rcv = ''
    rcv += '- name: target_e \n'
    rcv += '  side: %s \n' % 'FRONT_AND_BACK'
    rcv += '  per_primitive: %s \n' % 'INCOMING_AND_ABSORBED'
    rcv += '- name: virtual_target_e \n'
    rcv += '  side: %s \n' % 'FRONT'
    rcv += '  per_primitive: %s \n' % 'INCOMING'
    return geom, entt, rcv
